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以後,直接走了。。。。走了。。。。走了。。。。。到了程序的盡頭。。。。。。線程