【问题标题】:Asyncio.create_task() and asyncio.gather() running in sequenceAsyncio.create_task() 和 asyncio.gather() 依次运行
【发布时间】:2021-07-13 04:11:43
【问题描述】:

我有一个 API,需要很长时间才能完成。所以我想把它拆分成许多更小的作业,然后并行运行它们,等待结果再发送响应。

我的截图代码:

@app.post("/data")
async def get_tsp_events:
    query = [foo, bar, foo, bar]
    tasks = [asyncio.create_task(do_work(param1, param2)) for query in queries]
    events = await asyncio.gather(*tasks)
    return events

async def do_something(arg1, arg2):
    log("Start time")
    # This take a lot of times
    events = [event for event in range(10000000000)]
    log("End time")
    return events

正如我所见,所有任务都像普通代码一样按顺序运行(不使用asyncio.create_task()asyncio.gather) 我是 Python 新手,我的问题是:

  • 我错了吗?在哪里?
  • 有什么解决方案可以帮到我吗?

谢谢大家

【问题讨论】:

  • pass 替换为模拟 IO 活动的内容,例如await asyncio.sleep(0.1) 你应该会看到你期望的结果。一个不等待任何东西的协程只是名义上的协程——只有当一个协程挂起时,其他人才有机会运行。
  • @user4815162342。我在那个函数中有代码。不仅仅是pass。我刚刚更新了
  • 但是您在函数await 中的代码有什么作用吗? (请参阅我最初评论的第二句。)您能否提供一个重现该问题的最小示例,以及您期望的输出示例以及您实际观察到的示例?
  • 正如我所描述的。假设我有一个事件列表。我想更新所有事件的信息。我可以遍历列表以按顺序执行。但我想分成 2 个较小的列表并并行执行。我该怎么做?
  • asyncio 用于并行化 IO-bound 任务,而不是 CPU-bound 任务。根据您目前所展示的内容,它是不适合这项工作的工具。

标签: python python-3.x async-await python-asyncio fastapi


【解决方案1】:
  1. 事实上,async 和 await 并没有引入真正的并行,它们在你执行一些底层的“异步”操作时起作用,例如 aiohttpaiofile。然而,它们只为 IO-bound 任务带来并发。

  2. 如果您想要真正并行处理 CPU 密集型任务,请使用 multiprocessing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2020-10-13
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多