gevent
greenlet 已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python 还有一个比 greenlet 更强大的并且能够自动切换任务的模块 gevent
其原理是当一个 greenlet 遇到 IO(指的是 input output 输入输出,比如网络,文件操作等) 操作时,比如访问网络,就自动切换到其他的 greenlet,等到 IO 操作完成,再在适当的时候切换回来继续执行.
由于 IO 操作非常耗时,经常使程序处于等待状态,有了 gevent 为我们自动切换协程,就保证总有 greenlet 在运行,而不是等待 IO
安装
pip3 install gevent
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()
可以看到,3 个 greenlet 是依次运行而不是交替运行
0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
gevent 切换执行
运行结果
import gevent
def f(n):
for i in range(n):
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()
给程序打补丁
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
运行结果
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")
])
原文链接:做最专业最懂你的 python 开发者交流平台,提供你最需要的开发学习资源. 我们专注于 python 开发技术的学习与交流,我们坚持,每天进步一小步,人生进步一大步!关注【Python 开发者交流平台】,与我们一起学习进步.
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
=======================================================
来源: http://www.jianshu.com/p/5672a679f71a