亚洲必赢bwin696.comgevent

gevent

greenlet已经落实了协程,可是这还的人为切换,是无是当最好难为了,不要捉急,python还有一个比greenlet更精的又会自行切换任务之模块gevent

彼规律是当一个greenlet遭逢IO(指的是input output
输入输出,比如网络、文件操作等)操作时,比如看网络,就机关切换至此外的greenlet,等及IO操作完成,再以适宜的下切换回来继续执行。

鉴于IO操作特别耗时,通常要程序处于等候状态,有矣gevent为咱自行切换协程,就确保总起greenlet在运行,而不是等待IO

安装

pip3 install gevent

  1. gevent的使用

import gevent

def f(n):
for i in range(n):
print(gevent.getcurrent(), i)

g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()
运行结果

<Greenlet at 0x10e49f550: f(5)> 0
<Greenlet at 0x10e49f550: f(5)> 1
<Greenlet at 0x10e49f550: f(5)> 2
<Greenlet at 0x10e49f550: f(5)> 3
<Greenlet at 0x10e49f550: f(5)> 4
<Greenlet at 0x10e49f910: f(5)> 0
<Greenlet at 0x10e49f910: f(5)> 1
<Greenlet at 0x10e49f910: f(5)> 2
<Greenlet at 0x10e49f910: f(5)> 3
<Greenlet at 0x10e49f910: f(5)> 4
<Greenlet at 0x10e49f4b0: f(5)> 0
<Greenlet at 0x10e49f4b0: f(5)> 1
<Greenlet at 0x10e49f4b0: f(5)> 2
<Greenlet at 0x10e49f4b0: f(5)> 3
<Greenlet at 0x10e49f4b0: f(5)> 4
可见见,3个greenlet是各样运行而不是轮番运行

  1. gevent切换执行

import gevent

def f(n):
for i in range(n):
亚洲必赢bwin696.com,print(gevent.getcurrent(), i)
#于是来模拟一个耗时操作,注意不是time模块中之sleep
gevent.sleep(1)

g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()
运行结果

<Greenlet at 0x7fa70ffa1c30: f(5)> 0
<Greenlet at 0x7fa70ffa1870: f(5)> 0
<Greenlet at 0x7fa70ffa1eb0: f(5)> 0
<Greenlet at 0x7fa70ffa1c30: f(5)> 1
<Greenlet at 0x7fa70ffa1870: f(5)> 1
<Greenlet at 0x7fa70ffa1eb0: f(5)> 1
<Greenlet at 0x7fa70ffa1c30: f(5)> 2
<Greenlet at 0x7fa70ffa1870: f(5)> 2
<Greenlet at 0x7fa70ffa1eb0: f(5)> 2
<Greenlet at 0x7fa70ffa1c30: f(5)> 3
<Greenlet at 0x7fa70ffa1870: f(5)> 3
<Greenlet at 0x7fa70ffa1eb0: f(5)> 3
<Greenlet at 0x7fa70ffa1c30: f(5)> 4
<Greenlet at 0x7fa70ffa1870: f(5)> 4
<Greenlet at 0x7fa70ffa1eb0: f(5)> 4

  1. 深受程序打补丁

from gevent import monkey
import gevent
import random
import time

def coroutine_work(coroutine_name):
for i in range(10):
print(coroutine_name, i)
time.sleep(random.random())

gevent.joinall([
gevent.spawn(coroutine_work, “work1”),
gevent.spawn(coroutine_work, “work2”)
])
运转结果

work1 0
work1 1
work1 2
work1 3
work1 4
work1 5
work1 6
work1 7
work1 8
work1 9
work2 0
work2 1
work2 2
work2 3
work2 4
work2 5
work2 6
work2 7
work2 8
work2 9
from gevent import monkey
import gevent
import random
import time

暴发耗时操作时欲

monkey.patch_all() #
将顺序中之所以到的耗时操作的代码,换为gevent中温馨实现的模块

def coroutine_work(coroutine_name):
for i in range(10):
print(coroutine_name, i)
time.sleep(random.random())

gevent.joinall([
gevent.spawn(coroutine_work, “work1”),
gevent.spawn(coroutine_work, “work2”)
])
运行结果

work1 0
work2 0
work1 1
work1 2
work1 3
work2 1
work1 4
work2 2
work1 5
work2 3
work1 6
work1 7
work1 8
work2 4
work2 5
work1 9
work2 6
work2 7
work2 8
work2 9

=======================================================

原文链接:做最规范最懂你的python开发者交流平台,提供您然而要的出上资源。
大家注意于python开发技术的就学和交流,大家坚韧不拔,每一天提高同样多少步,人生提升同样不行步!关注【Python开发者交换平台】,与我们一并学学提升。

相关文章