在这种情况下,答案在文档中,但您必须稍微查找一下。首先,提醒你这对你意味着什么
等待
# the expression:
x = await future
# is equivalent to:
... magically suspend the coroutine until the future.done() becomes true ...
x = future.result()
换句话说,一旦执行包含
await
声明将是
result()
期待已久的未来。
documentation
说:
如果未来是
取消
,此方法会引发
CancelledError
因此,当有人取消了你期待的未来时
await future
表达式将引发异常!这很好地解释了原因
bar
不打印
hi
等待未来
baz
不打印
ho
(因为
await bar(...)
已提出)。
回溯永远不会打印,因为
loop.create_task
在“后台”(排序)中生成协同程序-如果没有人检查返回值,异常将丢失。既然你扔掉了
task
返回的对象
create_task
run_forever
为了让循环永远运行,循环只是继续运行,等待(永远)新任务以某种方式到达。
酒吧
取消错误
if __name__ == '__main__':
loop = asyncio.get_event_loop()
future = loop.create_future()
loop.create_task(foo(future))
loop.run_until_complete(baz(future))
输出:
Traceback (most recent call last):
File "xxx.py", line 19, in <module>
loop.run_until_complete(baz(future))
File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in run_until_complete
return future.result()
File "/usr/lib/python3.5/asyncio/futures.py", line 266, in result
raise CancelledError
concurrent.futures._base.CancelledError