首页  >  文章  >  后端开发  >  为什么不建议在 FastAPI 端点中使用 ThreadPoolExecutor?

为什么不建议在 FastAPI 端点中使用 ThreadPoolExecutor?

Patricia Arquette
Patricia Arquette原创
2024-11-12 16:07:02263浏览

Why is it not recommended to use ThreadPoolExecutor in FastAPI endpoints?

在 FastAPI 端点中使用 ThreadPoolExecutor 的潜在陷阱

在 FastAPI 端点中使用并发.futures.ThreadPoolExecutor 会引起对线程管理和潜在系统资源的担忧精疲力尽。以下是关键考虑因素:

线程增殖和资源匮乏

ThreadPoolExecutor 管理线程池。每个端点调用都可能创建新线程,从而导致线程过度增殖。这可能会给系统资源带来压力,尤其是当多个请求同时发生时。

HTTPX 的改进方法

为了减轻这些风险,建议改用 HTTPX 库。 HTTPX 提供了一个异步客户端,无需创建新线程即可高效处理多个请求。

HTTPX 配置

HTTPX 客户端可以配置为控制连接数并保持-活动连接,允许您根据应用程序的需求定制行为。

FastAPI 中的异步支持

FastAPI 本身支持使用 async 关键字的异步操作。这允许您异步执行 HTTP 请求,而不会阻塞事件循环。

异步函数和 HTTPX

要在 FastAPI 端点中异步使用 HTTPX,请定义一个异步函数使用 AsyncClient 实例发出 HTTP 请求。

管理 HTTPX 客户端

您可以使用 FastAPI 中的生命周期挂钩来管理 HTTPX 客户端的生命周期。这可确保客户端在启动时初始化并在关闭时关闭,以正确处理资源清理。

流式响应

为了避免将整个响应正文读入内存,请考虑在 HTTPX 和 FastAPI 的 StreamingResponse 类中使用流响应。

示例代码

以下是使用 HTTPX 并优化线程管理的 FastAPI 端点的示例:

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
import httpx
import asyncio

async def lifespan(app: FastAPI):
    # HTTPX client settings
    limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
    timeout = httpx.Timeout(5.0, read=15.0)

    # Initialize the HTTPX client
    async with httpx.AsyncClient(limits=limits, timeout=timeout) as client:
        yield {'client': client}

app = FastAPI(lifespan=lifespan)

@asynccontextmanager
async def send(client):
    req = client.build_request('GET', URL)
    yield await client.send(req, stream=True)

@app.get('/')
async def main(request: Request):
    client = request.state.client

    # Make HTTPX requests in a loop
    responses = [await send(client) for _ in range(5)]
    # Use a streaming response to return the first 50 chars of each response
    return StreamingResponse(iter_response(responses))

以上是为什么不建议在 FastAPI 端点中使用 ThreadPoolExecutor?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn