协程的理解(一)

2018-06-15  本文已影响12人  北游_

通过廖雪峰的Python3学习教程网站学习与整理以下内容。

原文地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000

概念

协程,英文名:Coroutine

协程执行流程:

协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。

实现方式

代码示例及说明

def consumer():
    r = ''
    while True:
        # yield 返回 r, 并将 producer() 中 c.send(n)中的 n 赋值给 consumer中的 n
        n = yield r
        if not n:
            return
        print('[PRODUCER] Consuming %s...{}'.format(n))
        r = '200OK!'
        
def producer(m):
    m.send(None)
    n = 0
    while n < 5:
        n += 1
        print('[PRODUCER] Producing %s...{}'.format(n))
        # producer 通过 send() 将变量 n 作为参数传给 consumer 中 yidle 接收的参数,
        # 并且将 yield 的返回值 赋给 res
        res = m.send(n)
        print('[PRODUCER] Consumer Return %s...{}'.format(res))
        
if __name__ == '__main__':
    c = consumer()
    producer(c)

执行流程:

  1. 执行脚本,首先执行 if _name_ == '_main_'中的代码块
  2. 首先 produce() 函数执行c.send(None) ,启动生成器,consumer() 遇到 n = yield r ,此时 r = '', yield 返回 空 并停止执行,进入等待
  3. produce()进入while循环,q = 0 + 1 = 1,打印“[PRODUCER] Producing %s...1”
  4. res = c.send(q) 。 将 1 传给consumer() ,此时 n = 1,if 判断条件为False。并且打印 [PRODUCER] Consuming %s...1。r 被重新赋值为 '200OK!' 。
  5. 因为死循环,程序再次执行到 n = yield r ,程序停止运行,进入等待。
  6. producer() 函数中第19 行 res 接收 上述 yield 返回的 r 变量,即'200OK!' 。
  7. 打印:[PRODUCER] Consumer Return %s...200OK!
  8. 接下来的从第 4 步开始循环执行。

以上部分可以发现,consumer 内部一直被中断,去执行 producer 中的程序。而不是 consumer 完全执行完。
这一点一定要吃透,否则无法理解 async 异步的流程。

上一篇 下一篇

猜你喜欢

热点阅读