协程 3.gevent

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
上一篇:并发编程 协程 | IO模型简介


下一篇:python——生成器(协程)gevent多任务, 生成器,迭代器