def consumer(): print(10) r = '' print(11) while True: print(12) n = yield r print(n) if not n: print(13) return print('Consumer Consuming %s....' %n) r = '200 ok' def produce(c): c.send(None) n = 0 while n < 5 : n = n + 1 print('[PRODUCER] producing %s....' % n) r = c.send(n) print('[PRODUCER] consumer return %s...' % r) c.close() c = consumer() produce(c)
生产函数中的c.send(None)会跳转入消费者函数,然后这个函数回执行到yield的位置然后将执行权限交还生产者函数。在while循环中再次执行c.send(n)的时候再次回到消费者函数上次停留的地方,并且将n的值通过r传入然后进行消费。
理解起来有点比起传统思维困难一些。而这就是生成器的运作方式。在单线程中,这种方式非常有效率而且还能达到解耦的效果。
10 11 12 [PRODUCER] producing 1.... 1 Consumer Consuming 1.... 12 [PRODUCER] consumer return 200 ok... [PRODUCER] producing 2.... 2 Consumer Consuming 2.... 12 [PRODUCER] consumer return 200 ok... [PRODUCER] producing 3.... 3 Consumer Consuming 3.... 12 [PRODUCER] consumer return 200 ok... [PRODUCER] producing 4.... 4 Consumer Consuming 4.... 12 [PRODUCER] consumer return 200 ok... [PRODUCER] producing 5.... 5 Consumer Consuming 5.... 12 [PRODUCER] consumer return 200 ok...
顺便说下pdb似乎没办法调试这种类型的程序。输入n之后,直接走了。。。。走了。。。。走了。。。。。到了程序的尽头。。。。。。