首页 > 后端开发 > Python教程 > 为什么 FastAPI 串行执行 API 调用而不是并行执行?

为什么 FastAPI 串行执行 API 调用而不是并行执行?

Susan Sarandon
发布: 2025-01-02 15:15:42
原创
217 人浏览过

Why Does FastAPI Execute API Calls Serially Instead of in Parallel?

FastAPI:为什么 API 调用是串行执行而不是并行执行

FastAPI 使用异步定义端点(也称为路径操作函数)定义和定义。虽然概念上 async def 可能建议并行化,但 FastAPI 实际上以不同的方式处理这些函数:

使用 async def 定义的端点:

  • 直接在事件循环中运行。
  • 只能从其他异步函数调用,并且在执行非异步操作之前必须暂停(等待),例如I/O。
  • 确保事件循环不被阻塞,并且其他任务可以并发执行。

使用 def 定义的端点:

  • 运行不是直接在事件循环中运行,而是在外部的单独线程中运行线程池。
  • 可以从异步或非异步函数调用。
  • 如果不暂停执行非异步操作,可能会阻塞事件循环并阻止其他任务执行。
  • 在某些场景下提供性能优化。

影响并行化:

基于这种理解,让我们检查一下您的代码示例:

@app.get("/ping")
async def ping(request: Request):
    print("Hello")
    time.sleep(5) # This sleeps the event loop for 5 seconds
    print("bye")
    return {"ping": "pong!"}
登录后复制

在这种情况下,会发生以下情况:

  • 两个请求to /ping 同时发送。
  • 异步 defENDPOINT 直接在事件中运行
  • time.sleep(5) 调用将事件循环暂停 5 秒。
  • 在这 5 秒内,第二个请求将排队并且无法处理,因为事件循环被阻塞.
  • 事件循环在 5 秒后恢复后,第二个请求是

因此,响应将按顺序打印:

Hello
bye
Hello
bye
登录后复制

要启用并行化,像 time.sleep() 这样的非异步操作不应该 用于异步定义端点。相反,可以应用以下方法之一:

  • 使用 run_in_threadpool() 生成线程并在事件循环之外执行阻塞操作。
  • 使用loop.run_in_executor()或 asyncio.to_thread() 在单独的线程或进程中运行阻塞操作。
  • 考虑使用ThreadPoolExecutor 或 ProcessPoolExecutor 用于在进程外运行计算密集型任务。

以上是为什么 FastAPI 串行执行 API 调用而不是并行执行?的详细内容。更多信息请关注PHP中文网其他相关文章!

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