首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步函数不异步工作。

异步函数不异步工作。
EN

Stack Overflow用户
提问于 2022-01-08 03:31:24
回答 2查看 170关注 0票数 3

我有个问题。

我编写了一个模拟http请求的简单代码:

代码语言:javascript
复制
from asyncio import sleep, run


async def get():
    print("Started get()")
    await sleep(3)
    print("Finished get()")


async def async_main():
    await get()
    await get()
    await get()


if __name__ == "__main__":
    run(async_main())

我希望结果应该是:

代码语言:javascript
复制
Started get()
Started get()
Started get()
(No output, just wait 3 seconds)
Finished get()
Finished get()
Finished get()

但结果是:

代码语言:javascript
复制
Started get()
(No output, just wait 3 seconds)
Finished get()
Started get()
(No output, just wait 3 seconds)
Finished get()
Started get()
(No output, just wait 3 seconds)
Finished get()

为什么会发生这种事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-08 13:27:57

您需要调度协同线,要么显式地使用asyncio.create_task(),要么隐式地使用asyncio.gather()

代码语言:javascript
复制
from asyncio import sleep, run


async def get():
    print("Started get()")
    await sleep(3)
    print("Finished get()")


async def async_main():
    tasks = [asyncio.create_task(get()), 
             asyncio.create_task(get()),
             asyncio.create_task(get())]  # Explicit
    await asyncio.gather(*tasks)

async def async_main(): # Option 2
    await asyncio.gather(get(), get(), get())  # Implicit

if __name__ == "__main__":
    run(async_main())
票数 1
EN

Stack Overflow用户

发布于 2022-01-08 14:13:28

只需异步运行任务,如下所示

代码语言:javascript
复制
async def async_main():
    await asyncio.gather(get(), get(), get())

if __name__ == "__main__":
    # run(async_main()) or
    asyncio.run(async_main())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70629400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档