Expand description

Due to the Stream trait’s inclusion in std landing later than Tokio’s 1.0 release, most of the Tokio stream utilities have been moved into the tokio-stream crate.

Why was Stream not included in Tokio 1.0?

Originally, we had planned to ship Tokio 1.0 with a stable Stream type but unfortunately the RFC had not been merged in time for Stream to reach std on a stable compiler in time for the 1.0 release of Tokio. For this reason, the team has decided to move all Stream based utilities to the tokio-stream crate. While this is not ideal, once Stream has made it into the standard library and the MSRV period has passed, we will implement stream for our different types.

While this may seem unfortunate, not all is lost as you can get much of the Stream support with async/await and while let loops. It is also possible to create a impl Stream from async fn using the async-stream crate.

Example

Convert a sync::mpsc::Receiver to an impl Stream.

use tokio::sync::mpsc;

let (tx, mut rx) = mpsc::channel::<usize>(16);

let stream = async_stream::stream! {
    while let Some(item) = rx.recv().await {
        yield item;
    }
};