Python其实是通过generator来实现的,也就是生成器。
我们都知道,在generator中,我们可以通过for in 来循环迭代,也可以通过不断调用next()来拿到yield返回的值。其实,yield还有一个特性,它可以接收generator.send()发送出来的数据哦。
试想,我们把要执行IO操作的代码封装成generator,然后放入一个消息循环中执行,当执行完后,我们再执行send操作,是不是我们就可以再yield处接收执行的结果了呢?
我们通过协程来实现一个生产者消费者模型
示例代码如下:
def consumer(name):
r='';
while True:
n = yield r
if not n:
return
print('[Consumer:%s],I am consuming %s...' % (name,n))
r = '200 OK'
def produce(name,c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[Produce:%s], I to producing %s...' % (name,n))
r = c.send(n)
print('[Produce:%s], Consumer return: %s' % (name,r))
c.close()
c = consumer('c1')
produce('p1',c)
结果输入为:
[Produce:p1], I to producing 1...
[Consumer:c1],I am consuming 1...
[Produce:p1], Consumer return: 200 OK
[Produce:p1], I to producing 2...
[Consumer:c1],I am consuming 2...
[Produce:p1], Consumer return: 200 OK
[Produce:p1], I to producing 3...
[Consumer:c1],I am consuming 3...
[Produce:p1], Consumer return: 200 OK
[Produce:p1], I to producing 4...
[Consumer:c1],I am consuming 4...
[Produce:p1], Consumer return: 200 OK
[Produce:p1], I to producing 5...
[Consumer:c1],I am consuming 5...
[Produce:p1], Consumer return: 200 OK
可以看到,生产者生产一个,然后通过send通知消费者进行消费。
代码分析:当我们执行c.send(None)的时候,触发生成器,此时r=‘’,当我们下一发送send时,执行yield后面的语句,然后发送下一次的r的值。
如此我们就只在一个线程中通过generator来实现了生产者消费者模型。
实际开发中如此写代码对于开发者来说是比较底层的,所以,python自然会给我们提供了编写协程代码的利器,我们将在后面章节中进行介绍。