← Rust

LESSON / ARTICLE

Future・Pinと非同期ランタイム内部

Future・Pinと非同期ランタイム内部を学び、実務での設計判断につなげます。

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までの流れを説明し、通知がない場合と過剰な場合の影響を比較してください。