futures-rs
Foundation library for async programming in Rust. Defines the core Future, Stream, and Sink traits used across the Rust async ecosystem. Provides executor primitives, join!/select! macros for combining futures, stream/sink adapters, and channel implementations. Most async Rust code depends on futures traits either directly or transitively.
Score Breakdown
⚙ Agent Friendliness
🔒 Security
Core async library — no network access, no security concerns.
⚡ Reliability
Best When
Writing executor-agnostic async Rust libraries, combining multiple futures, or implementing Stream/Sink traits.
Avoid When
Simple Tokio applications where tokio's built-in utilities cover your needs.
Use Cases
- • Use futures::join! and futures::select! macros to run multiple async operations concurrently in Rust
- • Implement Stream and Sink traits for custom async producers and consumers in Rust libraries
- • Use FutureExt and StreamExt combinators for map, then, flatten, and timeout operations on futures/streams
- • Access futures::channel::mpsc for async-runtime-agnostic bounded and unbounded channel implementations
- • Implement executor-agnostic async libraries that work with Tokio, async-std, or custom executors via futures traits
Not For
- • Tokio-specific async utilities — tokio has its own extensions that build on futures; tokio-stream for stream utilities
- • Simple async applications where tokio's built-in utilities are sufficient — futures crate adds complexity for basic async code
- • Non-Rust languages — futures is Rust-specific; use js Promises or Python asyncio equivalents
Interface
Authentication
Library — no auth needed.
Pricing
Open source foundational async library for Rust.
Agent Metadata
Known Gotchas
- ⚠ futures::select! is biased toward the first arm — use futures::select_biased! explicitly if bias is intentional or futures::select! randomly breaks ties
- ⚠ Using both futures and tokio StreamExt in the same file requires disambiguating: use futures::StreamExt as _ conflicts with use tokio_stream::StreamExt as _
- ⚠ futures::channel::mpsc is not Tokio-aware — use tokio::sync::mpsc for Tokio-integrated backpressure and waker integration
- ⚠ Pinning requirements are complex — futures often require Pin<Box<dyn Future>> for type erasure; Box::pin() is the common solution
- ⚠ futures 0.3 removed the Executor trait; use tokio::runtime or async-std for execution — futures crate no longer provides an executor
- ⚠ FutureExt::shared() allows cloning a future to poll from multiple places — requires the output to be Clone and adds overhead
Alternatives
Full Evaluation Report
Detailed scoring breakdown, competitive positioning, security analysis, and improvement recommendations for futures-rs.
Scores are editorial opinions as of 2026-03-06.