如何在 actix-web 服务器中共享 reqwest 客户端?
How to share reqwest clients in actix-web server?
我正在使用 actix-web 构建 Web 服务器,其中一种方法使用 reqwest 向外部发出 HTTP 请求 API:
#[get("/foo")]
async fn foo() -> impl Responder {
let resp = reqwest::get("https://externalapi.com/bar").await?; # GET request inside server
...
}
为了提高性能,我想重用reqwest的客户端,因为它持有一个连接池,根据the doc。
但是,我无法使用Arc
来共享客户端,因为文档中也有如下声明:
You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.
如何在函数调用之间共享客户端?
或者,我应该使用不同的库在 Web 服务器中创建 HTTP 请求吗?
实际上documentation中的建议是解决方案:
You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.
只是clone
客户。
请检查 source 中的 Client
定义:
#[derive(Clone)]
pub struct Client {
inner: Arc<ClientRef>,
}
您可以将Client
视为参考持有人
内部类型 (ClientRef
) 已经用 Arc
包装,如文档所述, Client
有 Clone
实现,因为除了 [= 没有其他字段18=],与自己用 Arc
包装客户端相比,克隆客户端不会造成任何运行时开销。
此外 Client
实现了 Send
这意味着可以跨线程发送客户端的克隆,因为 Client
上没有明确的可变操作,因此不需要 Mutex
在这里。 (我说明确是因为可能存在内部可变性)
我正在使用 actix-web 构建 Web 服务器,其中一种方法使用 reqwest 向外部发出 HTTP 请求 API:
#[get("/foo")]
async fn foo() -> impl Responder {
let resp = reqwest::get("https://externalapi.com/bar").await?; # GET request inside server
...
}
为了提高性能,我想重用reqwest的客户端,因为它持有一个连接池,根据the doc。
但是,我无法使用Arc
来共享客户端,因为文档中也有如下声明:
You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.
如何在函数调用之间共享客户端? 或者,我应该使用不同的库在 Web 服务器中创建 HTTP 请求吗?
实际上documentation中的建议是解决方案:
You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.
只是clone
客户。
请检查 source 中的 Client
定义:
#[derive(Clone)]
pub struct Client {
inner: Arc<ClientRef>,
}
您可以将Client
视为参考持有人
内部类型 (ClientRef
) 已经用 Arc
包装,如文档所述, Client
有 Clone
实现,因为除了 [= 没有其他字段18=],与自己用 Arc
包装客户端相比,克隆客户端不会造成任何运行时开销。
此外 Client
实现了 Send
这意味着可以跨线程发送客户端的克隆,因为 Client
上没有明确的可变操作,因此不需要 Mutex
在这里。 (我说明确是因为可能存在内部可变性)