【发布时间】: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