【发布时间】:2021-10-14 21:08:31
【问题描述】:
我正在尝试理解 asyncio,特别是 await 关键字。
这是我的代码:
async def sleep_and_print(s: str):
print(f'{datetime.utcnow()} Executing sleep_and_print({s})')
await asyncio.sleep(1)
print(f'{datetime.utcnow()} Completed sleep_and_print({s})')
async def main():
asyncio.create_task(sleep_and_print(0))
asyncio.create_task(sleep_and_print(1))
asyncio.create_task(sleep_and_print(2))
asyncio.gather(*[sleep_and_print(i) for i in range(3)])
if __name__ == "__main__":
asyncio.run(main())
输出是:
2021-10-14 10:08:03.242891 Executing sleep_and_print(0)
2021-10-14 10:08:03.242891 Executing sleep_and_print(1)
2021-10-14 10:08:03.242891 Executing sleep_and_print(2)
2021-10-14 10:08:03.243896 Executing sleep_and_print(0)
2021-10-14 10:08:03.243896 Executing sleep_and_print(1)
2021-10-14 10:08:03.243896 Executing sleep_and_print(2)
_GatheringFuture exception was never retrieved
future: <_GatheringFuture finished exception=CancelledError()>
concurrent.futures._base.CancelledError
我有两个初步的问题:
-
为什么使用
create_task()创建三个任务时的行为与使用gather()创建的任务不同?我知道gather()将同时提交任务以执行,而create_task()任务将单独提交。我不明白为什么gather()会导致异常。 -
为什么这个任务会开始但没有执行完
asyncio.create_task(sleep_and_print(0))而这两个都将完成,即使只等待第二个
asyncio.create_task(sleep_and_print(0)) await asyncio.create_task(sleep_and_print(1))
【问题讨论】:
标签: python python-asyncio