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가 리턴하는 JoinHandleFuture를 구현하며, 이를 통해 생성된 스레드에 join할 수 있습니다.

Future에 .await를 호출하면, 해당 Future가 준비될 때까지 현재 비동기 함수가 일시 중지됩니다. 그런 다음 Future가 준비가 되면, 그 값이 .await 구문의 값이 됩니다.

  • FuturePoll 타입의 실제 정의는 위에 보이는 그대로 입니다. 링크를 클릭하면 Rust 문서에서 한 번 더 확인할 수 있습니다.

  • 본 강의의 목적은 비동기 코드를 작성하는데 있기 때문에, 새로운 비동기 프리미티브를 만드는데 필요한 PinContext는 다루지 않습니다. 이들에 대해 간단히 설명하자면:

    • Context를 사용하면 Future가 이벤트가 발생할 때 다시 폴링되도록 예약할 수 있습니다.

    • Pin을 사용하면 메모리에서 Future의 위치가 고정되기 때문에 해당 future의 포인터가 항상 유효하게 유지됩니다. 이는 .await 후에 참조를 유효한 상태로 유지하기 위해 필요합니다.