Join
Join ์ฐ์ฐ์ ๋ชจ๋ future๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ, ๊ฐ future์ ๊ฒฐ๊ณผ๊ฐ์ ๋ด์ ์ปฌ๋ ์
์ ๋ฆฌํดํฉ๋๋ค. ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ Promise.all
์ด๋ ํ์ด์ฌ์ asyncio.gather
์ ์ ์ฌํฉ๋๋ค.
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); }
์ด ์์ ๋ฅผ, ๋ก์ปฌ ์ปดํจํฐ์ ๋ง๋ค์ด ๋ src/main.rs
์ ๋ณต์ฌํ๊ณ ๊ฑฐ๊ธฐ์์ ์คํํ์ธ์.
-
์๋ก ๋ค๋ฅธ ํ์ ์ ๊ฐ์ง๋ ์ฌ๋ฌ ์ฌ๋ฌ futures๋ค์ joinํ๊ณ ์ ํ ๊ฒฝ์ฐ
std::future::join!
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด futures๊ฐ ๋ช ๊ฐ๋ ์์์ง ์ปดํ์ผ ํ ๋ ์์์ผ ํ๋ค๋ ์ ์ ์ฃผ์ํ์ธ์. ์ด ๋งคํฌ๋ก๋ ์ง๊ธ์ โfuturesโ ํฌ๋ ์ดํธ์ ์์ผ๋ฉฐ ๊ณง ์์ ํ ๋์ดstd::future
์ ํฌํจ๋ ์์ ์ ๋๋ค. -
โjoinโ์ ์ํ์ฑ์ futures๋ค ์ค ํ๋๊ฐ ์์ ๋๋์ง ์์ ์๋ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋์ด์ ์งํ์ ๋ชปํ๊ณ ๋ฉ์ถฐ์์(stall) ์ ์์ต๋๋ค.
-
join_all
์join!
๊ณผ ๊ฒฐํฉํ์ฌ http ์๋น์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ชจ๋ ์์ฒญ๋ค์ ํ๊บผ๋ฒ์ ์งํ์ํฌ ์๋ ์์ต๋๋ค.futures::join!
์ ์ฌ์ฉํ์ฌtokio::time::sleep
์ future์ ์ถ๊ฐํด ๋ณด์ธ์. ์ด๊ฑด ํ์์์์ ๊ตฌํํ๋ ๊ฒ์ด ์๋์ ์ฃผ์ํ์ธ์. ์ค์ ๋ก, ํ์์์์ ๋ค์ ์ฅ์์ ์ค๋ช ํ๋select!
๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋tokio::time::sleep
์ ์ฌ์ฉํ ๊ฒ์ ๋จ์ํjoin!
์ ๋์์ ์ค๋ช ํ๊ธฐ ์ํจ์ ๋๋ค.