我正在观看import asyncio:学习 Python 的 AsyncIO #3 - 使用协程。讲师举了下面的例子:
import asyncio
import datetime
async def keep_printing(name):
while True:
print(name, end=" ")
print(datetime.datetime.now())
await asyncio.sleep(0.5)
async def main():
group_task = asyncio.gather(
keep_printing("First"),
keep_printing("Second"),
keep_printing("Third")
)
try:
await asyncio.wait_for(group_task, 3)
except asyncio.TimeoutError:
print("Time's up!")
if __name__ == "__main__":
asyncio.run(main())
输出有异常:
First 2020-08-11 14:53:12.079830
Second 2020-08-11 14:53:12.079830
Third 2020-08-11 14:53:12.080828
First 2020-08-11 14:53:12.580865
Second 2020-08-11 14:53:12.580865
Third 2020-08-11 14:53:12.581901
First 2020-08-11 14:53:13.081979
Second 2020-08-11 14:53:13.082408
Third 2020-08-11 14:53:13.082408
First 2020-08-11 14:53:13.583497
Second 2020-08-11 14:53:13.583935
Third 2020-08-11 14:53:13.584946
First 2020-08-11 14:53:14.079666
Second 2020-08-11 14:53:14.081169
Third 2020-08-11 14:53:14.115689
First 2020-08-11 14:53:14.570694
Second 2020-08-11 14:53:14.571668
Third 2020-08-11 14:53:14.635769
First 2020-08-11 14:53:15.074124
Second 2020-08-11 14:53:15.074900
Time's up!
_GatheringFuture exception was never retrieved
future: <_GatheringFuture finished exception=CancelledError()>
concurrent.futures._base.CancelledError
然后讲师就继续讨论其他主题,再也没有回到这个例子来说明如何修复它。幸运的是,通过实验,我发现我们可以通过在async 函数try/except中添加另一个来修复它:
事实上,有了这个版本main,我们甚至不需要try...except asyncio.CancelledErrorin keep_printing。它仍然可以正常工作。
那是为什么?为什么 catching CancelledErrorin mainwork 而不是 in keep_printing?视频讲师处理此异常的方式只会让我更加困惑。keep_printing他根本不需要更改任何代码!
守着星空守着你
烙印99
繁星点点滴滴
相关分类