通过 yield 方式实现
# -*- coding: utf-8 -*- ''' 协程,又称为线程,是一种用户装态的轻量级线程。 协程拥有自己的寄存器上下文和栈,在调度切换时,将寄存器上下文和栈保存在其他地方, 在切回来的时候恢复到先前保存的寄存器上下文和栈 协程的好处: 1.无需线程上下文切换的开销 2.方便切换控制流,简化编程模型 3.无需院子操作锁定及同步的开销 4.高并发,高扩展,低成本 缺点: 1.无法利用多核资源 2.阻塞操作会阻塞整个程序 ''' import time import queue def consumer(name): print("------->start eating baozi") while True: #函数中有yield的时候这个函数会变成一个生成器,当调用__next()__方法的时候会继续运行 new_baozi = yield print("[%s] is eating baozi %s"%(name,new_baozi)) def producer(): r = con.__next__() r = con2.__next__() n=0 while n<5: n+=1 con.send(n) con2.send(n) print('%s making baozi '%n) if __name__=='__main__': con = consumer('c1') con2 = consumer('c2') p = producer()
greenlet 实现手动切换协程
# -*- coding: utf-8 -*- from greenlet import greenlet def 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 实现自动切换
import gevent def foo(): print('runing in foo') gevent.sleep(2) print('再次切回到foo') def bar(): print("切换到bar") gevent.sleep(1) print('切换回bar') gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ])