Join
Uma operação de join espera até que todas as futures de um conjunto estejam prontas e retorna uma coleção de seus resultados. Isso é semelhante a Promise.all em JavaScript ou asyncio.gather em Python.
use anyhow::Result;
use futures::future;
use reqwest;
use std::collections::HashMap;
async fn size_of_page(url: &str) -> Result<usize> {
let resp = reqwest::get(url).await?;
Ok(resp.text().await?.len())
}
#[tokio::main]
async fn main() {
let urls: [&str; 4] = [
"https://google.com",
"https://httpbin.org/ip",
"https://play.rust-lang.org/",
"BAD_URL",
];
let futures_iter = urls.into_iter().map(size_of_page);
let results = future::join_all(futures_iter).await;
let page_sizes_dict: HashMap<&str, Result<usize>> =
urls.into_iter().zip(results.into_iter()).collect();
println!("{:?}", page_sizes_dict);
}
Copie este exemplo para o seu src/main.rs preparado e execute-o a partir daí.
-
Para várias futures de tipos disjuntos, você pode usar
std::future::join!mas deve saber quantas futures você terá em tempo de compilação. Isso atualmente está no cratefutures, em breve será estabilizado emstd::future. -
O risco do
joiné que uma das futures pode nunca ser resolvida, o que faria seu programa travar. -
Você também pode combinar
join_allcomjoin!, por exemplo, para unir todas as solicitações a um serviço http, bem como uma consulta ao banco de dados. Tente adicionar umtokio::time::sleeppara o futuro, usandofutures::join!. Isso não é um timeout (isso requerselect!, explicado no próximo capítulo), mas demonstrajoin!.