问题陈述:
虽然 FastAPI 提供并行功能,但 API通过多个浏览器选项卡同时发出的调用将按顺序而不是并行处理。当使用 def 而不是 async def 定义端点时,就会出现此行为。
分析和解决方案:
FastAPI 利用外部线程池来处理使用 def 定义的端点。当此类端点收到请求时,FastAPI 在线程池之外的单独线程中运行它。然而,一次只能处理一个请求,导致顺序请求处理而不是真正的并行性。
相反,使用 async def 定义的端点直接在主事件循环中执行,从而允许真正的并行请求处理。这是因为在等待异步操作时,async def 端点中的等待调用会屈服于事件循环中的其他任务。
要解决此问题,请确保定义不需要阻塞 I/O 绑定操作的端点使用 async def 来利用 FastAPI 的并行功能。以下是可以并行执行的端点示例:
@app.get("/ping") async def ping(request: Request): print("Hello") await asyncio.sleep(5) print("bye") return {"ping": "pong!"}
其他见解:
以上是为什么我的 FastAPI 应用程序按顺序而不是并行处理并发请求?的详细内容。更多信息请关注PHP中文网其他相关文章!