[我在youtube上观看了异步Pycon视频,演示者在她的一个示例中说她正在使用asyncio.create_task
而不是await
运行协程,因为await
会阻止协程的执行,直到它执行完毕为止等待已完成。我以为asyncio.create_task
返回一个Task
,需要等待。不过,我使用以下代码进行了测试,结果令人有些惊讶。
async def say_hello():
print("Hello")
await asyncio.sleep(0.5)
print("World")
async def run_coro(coro):
asyncio.create_task(coro)
asyncio.run(run_coro(say_hello()))
以上代码仅打印Hello
。我发现asyncio.create_task
中的run_coro
到达await
中的say_hello
行后就会立即停止执行。如果我按以下方式重写say_hello
并使用run_coro
运行它,那么我会看到`await asyncio.sleep(0.5)印在终端上之前的所有行
async def say_hello():
print("Hello")
print("Hello")
print("Hello")
print("Hello")
await asyncio.sleep(0.5)
print("World")
如果我按如下方式重写run_coro
,则所有行均按预期方式打印:
async def run_coro(coro):
asyncio.create_task(coro)
await asyncio.sleep(1)
任何人都可以告诉原因吗?
您需要通过阻止协程或使用await
暂停当前任务,以便可以执行下一个任务,这就是为什么使await asyncio.sleep(1)
正常工作的原因。查看更多:here