yield可以手工实现协程,但python为我们封装了一个greenlet,先看看yield实现,yield需要手工操作,无法实现IO操作时自动切换协程,greenlet是封装好的,能方便使用io切换!
import time
import queuedef consumer(name): print("--->starting eating baozi...") while True: new_baozi = yield print("[%s] is eating baozi %s" % (name,new_baozi)) #time.sleep(1)def producer(): r = con.__next__() r = con2.__next__() n = 0 while n < 5: n +=1 con.send(n) con2.send(n) print(" 33[32;1m[producer] 33[0m is making baozi %s" %n )if __name__ == '__main__': con = consumer("c1") con2 = consumer("c2") p = producer()方法二
greenlet实现方法:
greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
安装方法:
pip install greenle
如何使用请看下面例子!
from greenlet import greenletdef test1(): print(12) gr2.switch()#手工切换 print(34) gr2.switch()#手工切换def test2(): print(56) gr1.switch() print(78)gr1 = greenlet(test1)gr2 = greenlet(test2)gr1.switch() #手工切换Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
import gevent
def func1(): print(' 33[31;1m李闯在跟海涛搞... 33[0m') gevent.sleep(2) print(' 33[31;1m李闯又回去跟继续跟海涛搞... 33[0m')def func2(): print(' 33[32;1m李闯切换到了跟海龙搞... 33[0m') gevent.sleep(1) print(' 33[32;1m李闯搞完了海涛,回来继续跟海龙搞... 33[0m')gevent.joinall([ gevent.spawn(func1), gevent.spawn(func2), #gevent.spawn(func3),])