Future

Future はトレイトであり、 まだ完了していない可能性のある操作を表すオブジェクトによって実装されます。 Future はポーリングでき、pollPoll を返します。

#![allow(unused)]
fn main() {
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

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,
}
}

async 関数は impl Future を返します。自分で定義した型に対して Future を実装することも可能です(ただし一般的ではありません)。たとえば、tokio::spawn から返される JoinHandle は、その完了を待てるように Future を実装しています。

Future に対して .await キーワードを適用すると、現在の async 関数は その Future の準備が整うまで一時停止し、その後その出力になります。

  • Future 型と Poll 型は、ここに示したとおりに正確に実装されています。リンクをクリックすると、 ドキュメント内でその実装を表示できます。

  • Context により、タイムアウトなどのイベントが発生したときに、Future は 再度ポーリングされるよう自分自身をスケジュールできます。

  • Pin は、Future がメモリ内で移動しないことを保証し、その Future 内を指す ポインタが有効なままでいられるようにします。これは、.await の後でも参照が有効なままで いられるようにするために必要です。Pin については「Pitfalls」のセグメントで扱います。