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传入然后进行消费。

理解起来有点比起传统思维困难一些。而这就是生成器的运作方式。在单线程中,这种方式非常有效率而且还能达到解耦的效果。

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之后,直接走了。。。。走了。。。。走了。。。。。到了程序的尽头。。。。。。

原文地址:https://www.cnblogs.com/sunyuw/p/8398630.html