首页 > 后端开发 > Python教程 > 使用 Uvicorn 在 FastAPI 中发出并发 HTTP 请求时如何避免'ConnectionClosed”错误?

使用 Uvicorn 在 FastAPI 中发出并发 HTTP 请求时如何避免'ConnectionClosed”错误?

DDD
发布: 2024-12-12 21:59:15
原创
501 人浏览过

How Can I Avoid

在 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中文网其他相关文章!

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