コンテンツにスキップ

futures — Crate 詳細

futures

Mature no_std

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 での利用

futuresdefault-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 では stdalloc が有効になるため、完全な bare-metal / no_alloc を意識する場合は必ず default-features = false を指定してください。また、futures は便利なファサード crate ですが、依存範囲を厳密に制御したい組み込みライブラリでは futures-core, futures-sink, futures-io などの個別 crate を直接使う方が適している場合があります。

バージョン
0.3.32
ライセンス
MIT OR Apache-2.0
メンテナンス
活発に開発中

コード例

標準構成の futures で、executor::block_on により async ブロックを実行し、future::join で 2 つの Future を合成する例です。

block_on と join で複数の 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 構成で ready 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
}

関連 Crates