Я пытаюсь создать несколько задач Tokio, которые должны запрашивать различные веб-API. Мой план состоял в том, чтобы использовать для этого reqwest::Client.
Согласно запросу ::Client docs
Clientсодержит внутренний пул соединений, поэтому рекомендуется создать его и повторно использовать. Вам не нужно заключатьClientвRcилиArc, чтобы использовать его повторно, потому что он уже используетArcвнутри.
Попытка просто получить справочные результаты в обычной, ожидаемой жалобе на 'static
21 | let webapi1 = tokio::spawn(async {do_stuff(&webapi_client).await});
| ^^^^^^^^^^^-------------^^^^^^^^
| | |
| | `webapi_client` is borrowed here
| may outlive borrowed value `webapi_client`
Поэтому мой вопрос: стоит ли мне
Client в Arc, например.use std::sync::Arc;
async fn do_stuff(client : Arc<reqwest::Client>) {
client.get("www.google.com").send().await;
}
#[tokio::main]
async fn main() -> tokio::io::Result<()> {
let webapi_shared = Arc::new(reqwest::Client::new());
let webapi_client = &*webapi_shared;
let webapi_for_f1 = webapi_shared.clone();
let webapi_for_f2 = webapi_shared.clone();
let webapi1 = tokio::spawn(async move{do_stuff(webapi_for_f1).await});
let webapi2 = tokio::spawn(async move{do_stuff(webapi_for_f2).await});
webapi_client.get("www.google.com").send().await;
webapi1.await;
webapi2.await;
Ok(())
}
use std::sync::Arc;
async fn do_stuff(client : reqwest::Client) {
client.get("www.google.com").send().await;
}
#[tokio::main]
async fn main() -> tokio::io::Result<()> {
let webapi_client = reqwest::Client::new();
let webapi_for_f1 = webapi_client.clone();
let webapi_for_f2 = webapi_client.clone();
let webapi1 = tokio::spawn(async move{do_stuff(webapi_for_f1).await});
let webapi2 = tokio::spawn(async move{do_stuff(webapi_for_f2).await});
webapi_client.get("www.google.com").send().await;
webapi1.await;
webapi2.await;
Ok(())
}
...но я не заметил .clone() возврата мелких копий :)

...но я не заметил
.clone()возврата мелких копий :)
Но именно это и говорят цитированные вами документы:
Вам не нужно заключать Клиент в Rc или Arc, чтобы повторно использовать его, поскольку он уже использует
Arcвнутри себя.