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の準備ができるまで、現在の非同期の関数の一時停止を起こし、そしてその出力を評価します。
This slide should take about 4 minutes.
-
Future
とPoll
の型はまさに示されたように実装されます; ドキュメントの具体的な実装を見るにはリンクをクリックしてください。 -
Pin
とContext
については詳しくは扱いません。なぜなら、新しく非同期のプリミティブを作るよりも、非同期のコードを書くことに我々は重点を置くつもりだからです。簡潔には以下で説明されます:-
Context
は、特定のイベントが発生した時に、Futureが自分自身を再びポーリングされるようにスケジュールすることを可能にします。 -
Pin
はfutureへのポインタが有効であり続けるために、Futureがメモリの中で移動されないことを確実にします。これは、参照が.await
の後に有効であり続けるために必要です。
-