"""
协程 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
Python对协程的支持是通过generator实现的。
在generator中,我们不但可以通过for循环来迭代,还可以不断调用next()函数获取由yield语句返回的下一个值。
但是Python的yield不但可以返回一个值,它还可以接收调用者发出的参数。
来看例子:
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。
如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高
"""
# 生产者
def producer(c):
# 发送消息启动生成器
c.send(None)
n = 0
while n < 5:
n = n + 1
print('生产者生产出数据:%s' % n)
# 生产出来的n 发送给消费者进行消费
r = c.send(n)
print('消费者返回数据:%s' % r)
print('生产者说:口气不小,我继续生产,撑死你')
# 生产完成 关闭生成器 就是消费者
c.close()
# 消费者
def consumer():
r = ''
while True:
# 获取生产者传入参数 同时可以将r返回给生产者 yield可取参又可传参
n = yield r
if not n:
return
print('消费者消费数据:%s' % n)
r = '消费数据(%s)完成,你可以继续生成,你生产多少我就吃多少' % n
c = consumer()
producer(c)
执行结果如下:
生产者生产出数据:1
消费者消费数据:1
消费者返回数据:消费数据(1)完成,你可以继续生成,你生产多少我就吃多少
生产者说:口气不小,我继续生产,撑死你
生产者生产出数据:2
消费者消费数据:2
消费者返回数据:消费数据(2)完成,你可以继续生成,你生产多少我就吃多少
生产者说:口气不小,我继续生产,撑死你
生产者生产出数据:3
消费者消费数据:3
消费者返回数据:消费数据(3)完成,你可以继续生成,你生产多少我就吃多少
生产者说:口气不小,我继续生产,撑死你
生产者生产出数据:4
消费者消费数据:4
消费者返回数据:消费数据(4)完成,你可以继续生成,你生产多少我就吃多少
生产者说:口气不小,我继续生产,撑死你
生产者生产出数据:5
消费者消费数据:5
消费者返回数据:消费数据(5)完成,你可以继续生成,你生产多少我就吃多少
生产者说:口气不小,我继续生产,撑死你
Process finished with exit code 0