Future

Futureはトレイトであり、まだ完了してないかもしれない操作を表現するオブジェクトにより実装されます。Futureはポーリングされることがあり、pollPollを返します。

#![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の準備ができるまで、現在の非同期の関数の一時停止を起こし、そしてその出力を評価します。

This slide should take about 4 minutes.
  • FuturePollの型はまさに示されたように実装されます; ドキュメントの具体的な実装を見るにはリンクをクリックしてください。

  • PinContextについては詳しくは扱いません。なぜなら、新しく非同期のプリミティブを作るよりも、非同期のコードを書くことに我々は重点を置くつもりだからです。簡潔には以下で説明されます:

    • Contextは、特定のイベントが発生した時に、Futureが自分自身を再びポーリングされるようにスケジュールすることを可能にします。

    • Pinはfutureへのポインタが有効であり続けるために、Futureがメモリの中で移動されないことを確実にします。これは、参照が.awaitの後に有効であり続けるために必要です。