python coroutine

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

相關文章
相關標籤/搜索