http - 如何在 actix-web 服务器中共享 reqwest 客户端?
问题描述
我正在使用 actix-web 构建一个 Web 服务器,其中一种方法使用 reqwest 向外部 API 发出 HTTP 请求:
#[get("/foo")]
async fn foo() -> impl Responder {
let resp = reqwest::get("https://externalapi.com/bar").await?; # GET request inside server
...
}
根据文档,为了提高性能,我想重用 reqwest 的客户端,因为它拥有一个连接池。但是,我不能使用Arc
共享客户端,因为文档也有以下声明:
您不必将 Client 包装在 Rc 或 Arc 中即可重用它,因为它已经在内部使用了 Arc。
如何跨函数调用共享客户端?或者,我应该使用不同的库在 Web 服务器中创建 HTTP 请求吗?
解决方案
实际上文档中的建议是解决方案:
您不必将 Client 包装在 Rc 或 Arc 中即可重用它,因为它已经在内部使用了 Arc。
简直clone
就是客户端。
请从源代码Client
检查定义:
#[derive(Clone)]
pub struct Client {
inner: Arc<ClientRef>,
}
您可以将Client
其视为参考持有人
内部 type( ClientRef
) 已Arc
按照文档所述进行包装并Client
具有Clone
实现,因为除了 之外没有其他字段inner: Arc<_>
,因此与自己包装相比,克隆客户端不会导致任何运行时开销Arc
。
另外Client
实现Send
这意味着客户端的克隆可以跨线程发送,因为这里不需要显式的可变Client
操作Mutex
。(我说明确是因为可能存在内部可变性)
推荐阅读
- javascript - 未捕获的类型错误:无法读取未定义的属性“img”
- python - 如何约束 2 个字典,其中一个是驱动程序,每个键一个驱动对象
- swift - 如何确定 UIButton 类的选择状态?
- python - 从 HDF5 文件中读取 pandas.Dataframe 列的子集
- python - Python 列表是否支持浮点数?什么时候需要浮点数不能做的整数?
- javascript - 禁用选择元素中的一个选项并启用其他选项
- node.js - 如何通过带有 swagger-client 的 put 方法发送请求正文参数
- mysql - 加入时如何让 MySQL 优化器首先使用我的索引?
- html - 从 SQL 数据库中选择某些 id 并将它们与其他 id 区别对待
- neural-network - 当添加一个新的节点基因时,是给它一个全局的还是局部的新编号?整洁的