По состоянию на 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
Преобразование потока обратно в будущее.
Смотри также: