在 Uvicorn/FastAPI 中发出 HTTP 请求
处理使用 FastAPI 和 Uvicorn 构建的 HTTP 端点时,通常会从外部 API 请求数据。但是,在处理多个并发请求时,可能会出现“can't handle event type ConnectionClosed when role=SERVER and state=SEND_RESPONSE”等错误。发生这种情况是因为默认的 HTTP 客户端库“requests”在并发环境中使用时不是完全线程安全的。
要解决此问题,请考虑实现名为 httpx 的替代 HTTP 客户端库。它提供了一个异步 API,有助于避免 FastAPI 中的线程安全问题。下面的示例展示了如何在 FastAPI 中使用 httpx:
from fastapi import FastAPI, Request, BackgroundTask from fastapi.responses import StreamingResponse, Response from contextlib import asynccontextmanager import httpx @asynccontextmanager async def lifespan(app: FastAPI): async with httpx.AsyncClient() as client: yield {'client': client} app = FastAPI(lifespan=lifespan) @app.get('/') async def home(request: Request): client = request.state.client req = client.build_request('GET', 'https://www.example.com') r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose()))
通过利用 httpx 的异步 API,您可以更有效地在 FastAPI 中处理 HTTP 请求,同时保持线程安全。您可以使用客户端对象上的“limits”关键字参数进一步自定义连接池大小。
以上是使用 Uvicorn 在 FastAPI 中发出并发 HTTP 请求时如何避免'ConnectionClosed”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!