Futureの状態機械
async関数は状態を保持するFutureへ変換されます。await地点ごとに再開に必要な値が保持されます。内部表現はコンパイラ詳細であり、安定ABIとして依存しません。
pollとWaker
ExecutorはFutureをpollします。Pendingなら後で再pollされるようWakerで通知します。過剰なpollはCPUを消費し、通知されなければタスクが進みません。
Pin
一部Futureは自己参照状態を持つことがあります。Pinは値が移動しない保証を型で表します。
use std::{future::Future,pin::Pin,task::{Context,Poll}};
struct Ready;
impl Future for Ready{
type Output=u32;
fn poll(self:Pin<&mut Self>,_:&mut Context<'_>)->Poll<u32>{Poll::Ready(7)}
}
設計演習
PendingからWaker通知、再pollまでの流れを説明し、通知がない場合と過剰な場合の影響を比較してください。