”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Uvicorn 在 FastAPI 中发出并发 HTTP 请求时如何避免“ConnectionClosed”错误?

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

发布于2024-12-21
浏览:451

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”关键字参数进一步自定义连接池大小。

最新教程 更多>
  • 如何使用 Eloquent 或查询生成器将多行插入数据库?
    如何使用 Eloquent 或查询生成器将多行插入数据库?
    使用 Eloquent 或 Fluent 同时插入多行此查询探讨了如何使用 Eloquent 中的单个查询将多行插入数据库(或流畅的)框架。给定的示例使用 UserSubject::where('user_id', Auth::id())->select('subject_i...
    编程 发布于2024-12-21
  • 如何在 Retrofit 中使用自定义 Gson 转换器高效提取嵌套 JSON 数据?
    如何在 Retrofit 中使用自定义 Gson 转换器高效提取嵌套 JSON 数据?
    在 Retrofit 中使用自定义 Gson 转换器提取嵌套 JSON许多 API 提供具有通用 JSON 结构的响应,其中根对象包含嵌套对象包含所需数据的“内容”字段。然而,大多数 POJO 只对“内容”字段中的数据进行建模,使得改造类型适配器无法提取并返回适当的对象。为了解决这个问题,可以开发一...
    编程 发布于2024-12-21
  • 如何使用 PHP 将字符串中的普通 URL 转换为可点击的超链接?
    如何使用 PHP 将字符串中的普通 URL 转换为可点击的超链接?
    使用 PHP 链接字符串中的 URL在 PHP 中,链接字符串中的 URL 可能是一项有用的任务,例如在文本中生成可点击链接等任务内容。一种常见的用例是将包含 URL 的纯字符串转换为具有可点击超链接的 HTML。语法:$string = preg_replace( "~[[:alph...
    编程 发布于2024-12-21
  • 为什么在 C 语言中从字符中减去“0”会显示其数值?
    为什么在 C 语言中从字符中减去“0”会显示其数值?
    解码字符值:为什么减去“0”会泄露数字表示出现一个令人费解的问题:为什么从a中减去“0” C 中的字符揭示了它所代表的数值?为了解开这个谜团,让我们深入研究一下ASCII(美国信息交换标准代码)领域,它为每个字符分配数字代码。 '0' 保留此数字序列中的第一个位置,后续字符逐渐分配更...
    编程 发布于2024-12-21
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-12-21
  • 如何启用和禁用MySQL查询审计一小时?
    如何启用和禁用MySQL查询审计一小时?
    在 MySQL 中启用查询审核如果您希望监控并记录在 MySQL 数据库上执行的所有查询一个小时,您可以可以打开审核日志记录。审核日志记录配置启用审核日志记录和转储将日志写入文件,请在 MySQL 控制台中执行以下命令:SET global log_output = 'FILE'; SET glob...
    编程 发布于2024-12-21
  • 如何使用 JavaScript 创建可悬停的选择框选项?
    如何使用 JavaScript 创建可悬停的选择框选项?
    可悬停选择框选项当前的问题涉及创建一个选择框,当将字段悬停在该选择框上时,选项说明可见,而不是单击打开options.实现为了实现此功能,我们利用了 JavaScript 方法:如下:$('#selectUl li:not(":first")').addClass('unsele...
    编程 发布于2024-12-21
  • 解析 JSON 数据时如何解决“TypeError:字符串索引必须是整数”?
    解析 JSON 数据时如何解决“TypeError:字符串索引必须是整数”?
    避免“TypeError:字符串索引必须是整数”当尝试将 JSON 文件中的数据转换为可理解的 CSV 格式时,您可能会遇到“TypeError:字符串索引必须是整数”错误。当像字典一样访问字符串的字段时,会出现此错误。让我们探索解决方案。理解错误要理解该错误,需要注意的是,Python 中的字符串...
    编程 发布于2024-12-21
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-21
  • 如何使用 jQuery 禁用和启用输入字段?
    如何使用 jQuery 禁用和启用输入字段?
    使用 jQuery 禁用和启用输入字段使用 HTML 表单元素时,通常需要为用户禁用或启用某些输入字段相互作用。 jQuery 提供了多种方法来完成这些任务。禁用输入字段在 jQuery 版本 1.6 及更高版本中禁用输入字段的首选方法是通过 prop( ) function:$("inp...
    编程 发布于2024-12-21
  • 在 Go 中对 App Engine 模板进行单元测试时如何解决路径问题?
    在 Go 中对 App Engine 模板进行单元测试时如何解决路径问题?
    如何在 Go 的单元测试中解决 App Engine 模板的路径规范使用 App Engine 和 Go 时,使用内置模板包可能会遇到挑战在单元测试期间。具体来说,该问题是由于服务器无法在测试环境中找到模板文件的路径而出现的。问题原因在常规应用程序执行期间,当前目录是 app.yaml 所在的应用程...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 如何在 PHP 中求和日期间隔?
    如何在 PHP 中求和日期间隔?
    在 PHP 中添加日期间隔在 PHP 中,我们可能会遇到需要添加两个或多个日期间隔来计算以小时和分钟为单位的总持续时间的情况。要实现此总和,我们可以按照以下步骤操作:为每个时间间隔创建 DateTime 对象。使用 diff() 方法计算每对对象之间的差异。 $a = new DateTime('1...
    编程 发布于2024-12-21
  • 如何使用 jQuery 检索“data-id”属性值?
    如何使用 jQuery 检索“data-id”属性值?
    使用 jQuery 访问 data-id 属性使用 jQuery Quicksand 插件时,通常需要检索被单击元素的“data-id”属性将信息传递到各种 Web 服务。下面介绍如何有效获取该属性值:'data-id'属性可以使用jQuery中的.attr()方法来访问。语法如下:...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3