嗨,我目前有一个函数,需要同时运行范围为 20 的 for 循环。
每个 for 循环都包含 API 调用,在从所有这些调用收集数据后,我将它们收集在单独的列表中,并在整个 for 循环完成后进行另一次计算。然而,20 个 for 循环过程花费了太多时间(大约 20 秒),我认为这不是非常低效。有什么办法让我同时运行这些 for 循环吗?它是我尝试使用 FastAPI 构建的一个 Web 服务。
我尝试了多重处理,但我认为这不是我正在寻找的东西,因为它启动了多个服务器。我只需要同时处理整个 for 循环,这样我就可以减少它的运行时间。 (我找到了一种同时调用多个api调用的方法,但不完全是我想要的,如果没有其他选择,我会选择这个选项)
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.7+ 构建 API。当涉及到并发运行任务时,Python 提供了多种选择,asyncio 库通常与 FastAPI 一起使用来进行异步编程。
如果你有一个想要并发运行的循环,你可以使用 asyncio.gather 来并发执行多个协程。这是使用 FastAPI 和 asyncio 的示例:
蟒蛇 复制代码 从 fastapi 导入 FastAPI 导入异步
应用程序 = FastAPI()
async def your_concurrent_function(item): # 你的逻辑在这里 print(f"正在处理{项目}") wait asyncio.sleep(1) # 模拟一些异步工作 print(f"处理完{item}")
@app.get("/concurrent-example/{items}") 异步 def并发_示例(项目:str): items_list = items.split(',')
# Create a list of coroutines
coroutines = [your_concurrent_function(item) for item in items_list]
# Run coroutines concurrently
await asyncio.gather(*coroutines)
return {"message": "All tasks completed concurrently"}
在此示例中,concurrent_example 端点采用逗号分隔的项目列表,并使用 your_concurrent_function 协程同时处理它们。 asyncio.gather 函数用于同时运行多个协程。
确保使用支持异步编程的 ASGI 服务器运行 FastAPI 应用程序。例如,您可以使用 Uvicorn:
bash 复制代码 uvicorn your_app_name:app --reload 将 your_app_name 替换为包含 FastAPI 应用程序的 Python 文件的实际名称。
请记住,your_concurrent_function 的实际实现将取决于您的具体用例和要求。如果您有阻塞 I/O 操作(例如数据库查询),您可能需要使用异步库或支持异步操作的 ORM。