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_all
comjoin!
, 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::sleep
para o futuro, usandofutures::join!
. Isso nĂŁo Ă© um timeout (isso requerselect!
, explicado no prĂłximo capĂtulo), mas demonstrajoin!
.