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