我有Stream
项(u32, Bytes)
,其中整数是0..n
范围内的索引我想将此流拆分为n
个流,基本上是通过整数。
我考虑了几种可能性,包括
n
个流,每个流都会查看基础流以确定下一个项目是否适合它n
个水槽之一,然后再次使用水槽的另一侧作为流。 (这似乎与...有关
Forwarding from a futures::Stream to a futures::Sink)。我觉得这些可能性都不令人信服。第一个似乎创造了不必要的开销,而第二个似乎并不优雅(如果它甚至有效,我不确定)。
什么是拆分流的好方法?
答案 0 :(得分:3)
有一次我有类似的要求并为group_by
写了一个Stream
运算符。
我还没有将它发布到crates.io,因为我并不觉得它已经准备好消费了但是可以随意查看https://github.com/Lukazoid/lz_stream_tools处的代码或尝试使用它适合你自己。
将以下内容添加到cargo.toml:
[dependencies]
lz_stream_tools = { git = "https://github.com/Lukazoid/lz_stream_tools" }
并extern crate lz_stream_tools;
到您的bin.rs/lib.rs。
然后从你的代码中你可以这样使用它:
use lz_stream_tools::StreamTools;
let groups = some_stream.group_by(|x| x.0);
groups
现在是Stream
的{{1}}。
答案 1 :(得分:0)
您可以使用channels来表示特定于索引的流。您必须生成一个从原始流中提取的Task
,并且地图为Sender
s。