gevent
gevent
gevent是python中另一个实现协程的第三方库,greenlet需要指定切换任务,而gevent能够自动调度协程
gevent能够自动识别程序中的耗时操作,遇到耗时操作时自动切换到其他的任务
由于IO操作非常耗时,程序经常处于等待状态,使用gevent实现自动切换协程能保证总有greenlet在运行,而不是等待IO
gevent只有在遇到阻塞的时候才会执行协程
默认情况下time.sleep()不能被gevent识别为耗时操作
1.把time.sleep()替换为gevent.sleep()
2.添加补丁使gevent可以识别time.sleep()
monkey补丁的作用
1.在运行时替换方法、属性等
2.在不修改第三方代码的情况下增加原来不支持的功能
3.在运行时为内存中的对象增加patch,而不是在磁盘的源代码中增加
gevent
gevent.spawn(func,value1,value2,......)
功能:创建gevent对象
参数:
target:协程执行的函数名
gevent.getcurrent()
功能:获取当前协程对象
gevent.joinall([args])
功能:批量为协程执行join()
参数:需要join()的gevent组成的list
from gevent import monkey
monkey.patch_all()
功能:破解所有,使gevent可以识别time.sleep()
obj.sleep(time)
功能:休眠,是gevent可以识别的time.sleep()
obj.join()
功能:造成阻塞,使主线程等待协程执行完成再结束
from gevent import monkey
monkey.patch_all()
import time
import gevent
# 创建work1
def work1(n):
while True:
print('work1----------', n ,gevent.getcurrent())
n += 2
# 替换为gevent.sleep()
# time.sleep(0.5)
gevent.sleep(0.5)
print('run1')
# 创建work2
def work2(m):
while True:
print('----------work2', m ,gevent.getcurrent())
m += 2
# 添加补丁后gevent可以识别time.sleep()
time.sleep(0.5)
# gevent.sleep(0.5)
print('run2')
if __name__ == '__main__':
# 创建gevent对象
g1 = gevent.spawn(work1,1)
g2 = gevent.spawn(work2,2)
# 造成阻塞,程序阻塞时gevent自动切换到协程中执行
g1.join()
# g2.join()
work1---------- 1 <Greenlet at 0x97e5349168: work1(1)>
----------work2 2 <Greenlet at 0x97e53495e8: work2(2)>
run1
work1---------- 3 <Greenlet at 0x97e5349168: work1(1)>
run2
----------work2 4 <Greenlet at 0x97e53495e8: work2(2)>
run1
work1---------- 5 <Greenlet at 0x97e5349168: work1(1)>
run2
----------work2 6 <Greenlet at 0x97e53495e8: work2(2)>
run1
work1---------- 7 <Greenlet at 0x97e5349168: work1(1)>
run2