Future

Future๋Š” ํŠธ๋ ˆ์ž‡์ž…๋‹ˆ๋‹ค.์ด ํŠธ๋ ˆ์ž‡์€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ๋Š” ์ž‘์—…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Future๋Š” poll ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํด๋ง๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ํ•จ์ˆ˜๋Š” Poll์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

#![allow(unused)]
fn main() {
use std::pin::Pin;
use std::task::Context;

pub trait Future {
    type Output;
    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>;
}

pub enum Poll<T> {
    Ready(T),
    Pending,
}
}

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” impl Future๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค๊ณ  ์ด ํƒ€์ž…์ด Future๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด tokio::spawn๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” JoinHandle์€ Future๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์Šค๋ ˆ๋“œ์— joinํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Future์— .await๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ํ•ด๋‹น Future๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Future๊ฐ€ ์ค€๋น„๊ฐ€ ๋˜๋ฉด, ๊ทธ ๊ฐ’์ด .await ๊ตฌ๋ฌธ์˜ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

  • Future ์™€ Poll ํƒ€์ž…์˜ ์‹ค์ œ ์ •์˜๋Š” ์œ„์— ๋ณด์ด๋Š” ๊ทธ๋Œ€๋กœ ์ž…๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด Rust ๋ฌธ์„œ์—์„œ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณธ ๊ฐ•์˜์˜ ๋ชฉ์ ์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ Pin๊ณผ Context๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋“ค์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด:

    • Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Future๊ฐ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋‹ค์‹œ ํด๋ง๋˜๋„๋ก ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Pin์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ Future์˜ ์œ„์น˜๊ฐ€ ๊ณ ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น future์˜ ํฌ์ธํ„ฐ๊ฐ€ ํ•ญ์ƒ ์œ ํšจํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” .await ํ›„์— ์ฐธ์กฐ๋ฅผ ์œ ํšจํ•œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.