Совместное использование reqwest::Client между задачами tokio

Я пытаюсь создать несколько задач 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`

Поэтому мой вопрос: стоит ли мне

  1. Тем не менее оберните 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(())
}

  1. Просто клонируйте клиент:
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() возврата мелких копий :)

  1. Смягчить проблему с жизненным циклом каким-либо другим способом и просто получить ссылку? (любые подсказки также приветствуются здесь)
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

...но я не заметил .clone() возврата мелких копий :)

Но именно это и говорят цитированные вами документы:

Вам не нужно заключать Клиент в Rc или Arc, чтобы повторно использовать его, поскольку он уже использует Arc внутри себя.

Другие вопросы по теме