Как выполнить параллельные асинхронные запросы HTTP GET с помощью reqwest? - PullRequest
0 голосов
/ 26 июня 2018

Асинхронный пример полезен, но, будучи новичком в Rust и Tokio, я изо всех сил пытаюсь понять, как выполнять N запросов одновременно, используя URL-адреса из вектора и создавая итератор ответа. HTML для каждого URL в виде строки.

Как это можно сделать?

1 Ответ

0 голосов
/ 26 июня 2018

По состоянию на 0,9:

use futures::{stream, Future, Stream}; // 0.1.26
use reqwest::r#async::Client; // 0.9.14
use tokio; // 0.1.18

type Result<T> = std::result::Result<T, Box<std::error::Error>>;

const PARALLEL_REQUESTS: usize = 2;

fn main() -> Result<()> {
    let client = Client::new();

    let urls = vec!["https://api.ipify.org", "https://api.ipify.org"];

    let bodies = stream::iter_ok(urls)
        .map(move |url| {
            client
                .get(url)
                .send()
                .and_then(|res| res.into_body().concat2().from_err())
        })
        .buffer_unordered(PARALLEL_REQUESTS);

    let work = bodies
        .for_each(|b| {
            println!("Got {} bytes", b.len());
            Ok(())
        })
        .map_err(|e| panic!("Error while processing: {}", e));

    tokio::run(work);
    Ok(())
}

stream::iter_ok(urls)

stream::iter_ok

Взять коллекцию строк и преобразовать ее в Stream.

.and_then(|res| res.into_body().concat2().from_err())

Stream::concat2, Stream::from_err

Возьмите поток тела каждого ответа и соберите все в один большой кусок.

.buffer_unordered(N);

Stream::buffer_unordered

Преобразование потока фьючерсов в поток значений будущего, выполняя фьючерсы параллельно.

let work = bodies.for_each(|b| {
    println!("Got {} bytes", b.len());
    Ok(())
});

Stream::for_each

Преобразование потока обратно в будущее.

Смотри также:

...