Модуль stream
Поскольку трейт Stream вошёл в std позже, чем состоялся выпуск Tokio 1.0, большинство утилит Tokio для потоков перенесли в крейт tokio-stream.
Почему Stream не вошёл в Tokio 1.0?
Изначально мы планировали выпустить Tokio 1.0 со стабильным типом Stream, но, к сожалению, RFC RFC не успел пройти слияние, чтобы Stream достиг std в стабильном компиляторе к выпуску Tokio 1.0. По этой причине команда решила перенести все утилиты на основе Stream в крейт tokio-stream. Хотя это не идеальный вариант, после того как Stream появится в стандартной библиотеке и закончится период MSRV, мы реализуем потоки для наших различных типов.
Хотя это может показаться досадным, не всё потеряно: большую часть поддержки Stream можно получить с помощью циклов async/await и while let. Также можно создать impl Stream из async fn с помощью крейта async-stream.
Пример
Преобразование sync::mpsc::Receiver в 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;
}
};
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/stream/index.html