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 crate futures, em breve serĂĄ estabilizado em std::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 com join!, por exemplo, para unir todas as solicitaçÔes a um serviço http, bem como uma consulta ao banco de dados. Tente adicionar um tokio::time::sleep para o futuro, usando futures::join!. Isso nĂŁo Ă© um timeout (isso requer select!, explicado no prĂłximo capĂ­tulo), mas demonstra join!.