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传入而后进行消费。函数
理解起来有点比起传统思惟困难一些。而这就是生成器的运做方式。在单线程中,这种方式很是有效率并且还能达到解耦的效果。spa
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以后,直接走了。。。。走了。。。。走了。。。。。到了程序的尽头。。。。。。线程