asyncio.create_task立即执行协程

问题描述 投票:0回答:1

[我在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)

任何人都可以告诉原因吗?

asynchronous python-asyncio python-3.7
1个回答
0
投票

您需要通过阻止协程或使用await暂停当前任务,以便可以执行下一个任务,这就是为什么使await asyncio.sleep(1)正常工作的原因。查看更多:here

© www.soinside.com 2019 - 2024. All rights reserved.