展开描述
由于 Stream trait 进入 std 的时间晚于 Tokio 1.0 发布,因此大多数 Tokio 流实用工具已移至 tokio-stream crate。
§Why was Stream not included in Tokio 1.0?
最初,我们计划在 Tokio 1.0 中发布一个稳定的 Stream 类型,但不幸的是,RFC 未能在 Tokio 1.0 发布前及时合并,使 Stream 能够在稳定编译器上进入 std。因此,团队决定将所有基于 Stream 的实用工具移至 tokio-stream crate。虽然这并不理想,但一旦 Stream 进入标准库并且 MSRV 期限过去,我们将为不同的类型实现 stream。
虽然这似乎令人遗憾,但并非一无所有,因为你可以通过 async/await 和 while let 循环获得大部分 Stream 支持。也可以使用 async-stream crate 从 async fn 创建 impl 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;
}
};