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

来源:13-3 task取消和子协程调用原理

慕九州4321812

2021-07-18

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

谢谢

写回答

1回答

bobby

2021-07-23

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

0
0

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程