首页 > 后端开发 > Python教程 > 为什么我的 FastAPI 应用程序按顺序而不是并行处理并发请求?

为什么我的 FastAPI 应用程序按顺序而不是并行处理并发请求?

Linda Hamilton
发布: 2025-01-01 01:12:09
原创
619 人浏览过

Why Does My FastAPI Application Process Concurrent Requests Sequentially Instead of in Parallel?

FastAPI 以串行方式而不是并行方式执行 API 调用

问题陈述:

虽然 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!"}
登录后复制

其他见解:

  • 阻塞操作,例如 time.sleep(),在 async def 端点中,将阻塞整个服务器,呈现并行处理的好处
  • CPU 密集型任务或阻塞 I/O 操作可以使用 run_in_threadpool()、loop.run_in_executor()、ThreadPoolExecutor 或 ProcessPoolExecutor 等技术在单独的线程或进程中执行。
  • 增加worker(进程)数量可以增强并发性并服务更多请求
  • 对于繁重的后台计算,请考虑使用 apscheduler 中的 Celery 或 AsyncIOScheduler 等工具。

以上是为什么我的 FastAPI 应用程序按顺序而不是并行处理并发请求?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板