futures — Crate 詳細
futures
Rust の非同期プログラミング基盤を提供する crate。Future / Stream / Sink、join! / select! などの制御フロー、executor、channel、非同期 I/O 抽象などをまとめて利用できる futures-rs のファサード crate です。default-features = false により no_std 環境でも利用できますが、API は限定されます。
A facade crate for futures-rs that provides foundational abstractions and utilities for asynchronous programming in Rust, including Future, Stream, Sink, combinators, executors, channels, and async I/O abstractions.
概要
futures は Rust の非同期プログラミングを支える futures-rs プロジェクトのファサード crate です。Future, Stream, Sink といった基本抽象に加え、FutureExt / StreamExt などの拡張 trait、join! / select! などの制御フロー、executor、channel、非同期 I/O 関連の抽象をまとめて扱えます。
Rust 標準ライブラリにも core::future::Future は存在しますが、futures crate は Future / Stream / Sink を組み合わせるための実用的なユーティリティ群を提供します。特に、非同期処理をライブラリとして抽象化したい場合、Tokio や Embassy など特定ランタイムに直接依存せず、より汎用的な Future / Stream ベースの API を設計しやすい点が重要です。
no_std での利用
futures は default-features = false により no_std 環境で利用できます。ただし、標準構成で有効な std, alloc, executor などを外すため、利用できる API は限定されます。組み込みファームウェアでは、executor やタイマ、割り込み、DMA などは Embassy / RTIC / HAL 側に任せ、ライブラリ境界では Future や最小限の combinator を使う設計が扱いやすいです。
[dependencies]
futures = { version = "0.3", default-features = false }
組み込み Rust での位置づけ
Embassy などの async executor を使うアプリケーションでは、アプリケーション全体の実行基盤としては embassy-executor を使い、汎用的な Future / Stream の型や combinator が必要な場面で futures / futures-core / futures-util を選択するのが現実的です。依存を最小化したいライブラリでは futures-core のみを使い、アプリケーションや PC 側ツールでは futures を使う、という分け方も有効です。
注意点
default feature では std と alloc が有効になるため、完全な bare-metal / no_alloc を意識する場合は必ず default-features = false を指定してください。また、futures は便利なファサード crate ですが、依存範囲を厳密に制御したい組み込みライブラリでは futures-core, futures-sink, futures-io などの個別 crate を直接使う方が適している場合があります。
コード例
標準構成の futures で、executor::block_on により async ブロックを実行し、future::join で 2 つの Future を合成する例です。
use futures::executor::block_on;use futures::future::{join, ready};
fn main() { let task = async { let left = ready(20_u32); let right = ready(22_u32);
let (a, b) = join(left, right).await; a + b };
let result = block_on(task);
assert_eq!(result, 42); println!("result = {result}");}Cargo.toml で `futures = { version = "0.3", default-features = false }` と指定した no_std ライブラリ向けの最小例です。executor や channel など std/alloc 依存の API は使わず、Future の基本ユーティリティだけを利用します。
#![no_std]
use futures::future::{ready, Ready};
pub fn answer() -> Ready<u32> { ready(42)}
pub async fn add_ready_values() -> u32 { let a = ready(20_u32).await; let b = ready(22_u32).await; a + b}