老师您好,官方解释的子协程调用过程中,显示compute()在执行到await sleep(1.0)后, 会通过委托生成器建立的“通道”向Task返回一个消息,之后Task会等待1秒。对于之前讲解的field from的逻辑原理伪代码,已经明白了主调用函数与子生成器之间建立“管道”,但像这种“compute()在执行到await sleep(1.0)”,然后通过管道向Task发送信息 和之前伪代码中展示的“管道”是同一回事吗?
如下是原理伪代码:
_i = iter(EXPR) # EXPR是一个可迭代对象,_i其实是子生成器;
try:
_y = next(_i) # 预激子生成器,把产出的第一个值存在_y中;
except StopIteration as _e:
_r = _e.value # 如果抛出了StopIteration
异常,那么就将异常对象的value
属性保存到_r,这是最简单的情况的返回值;
else:
while 1: # 尝试执行这个循环,委托生成器会阻塞;
_s = yield _y # 生产子生成器的值,等待调用方send()
值,发送过来的值将保存在_s中;
try:
_y = _i.send(_s) # 转发_s,并且尝试向下执行;
except StopIteration as _e:
_r = _e.value # 如果子生成器抛出异常,那么就获取异常对象的value
属性存到_r,退出循环,恢复委托生成器的运行;
break
RESULT = _r # _r就是整个yield from表达式返回的值。
谢谢