协程的实现为协作式而非抢占式的,这是和进程线程的最大区别。在Python中,利用yield和send可以很容易实现协程。
首先复习下生成器。
如果一个函数使用了yield语句,那么它就是一个生成器函数。当调用这个函数时,它返回一个迭代器。当第一次调用__next__()时候,生成器函数主体开始执行,遇到yield表达式时候终止。
当使用__next__()方法时候,yield value语句返回None;当使用send(v)方法时候,yield value返回v。也就是说,__next__()方法相当于send(None)方法
1 def consumer() 2 while True: 3 line = yield #line接收的是yield这个表达式的返回值! 4 print(line.upper()) 5 6 7 def productor(): 8 with open('text.txt') as file: 9 for i, line in enumerate(file): 10 yield line 11 print("{0} lines".format(i)) 12 13 14 c = consumer() 15 c.__next__() #手动启动生成器,注意在Python3.X中不是c.next() 16 for i in productor(): 17 c.send(i)
参考资料:《改善Python程序的91个建议》建议66、67