请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

compute()会通过委托生成器建立的“通道”向Task返回消息

老师您好,官方解释的子协程调用过程中,显示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表达式返回的值。

谢谢

正在回答 回答被采纳积分+3

1回答

bobby 2021-07-23 10:47:11

这不算一回事。这是print_sum执行完成以后的返回,这个返回就委托给task,让task和loop去交互

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信