根据流项的属性将futures :: Stream拆分为多个流

时间:2017-08-14 22:38:47

标签: stream rust

我有Stream(u32, Bytes),其中整数是0..n范围内的索引我想将此流拆分为n个流,基本上是通过整数。

我考虑了几种可能性,包括

  • 创建n个流,每个流都会查看基础流以确定下一个项目是否适合它
  • 当物品到达时将物品推到n个水槽之一,然后再次使用水槽的另一侧作为流。 (这似乎与...有关 Forwarding from a futures::Stream to a futures::Sink)。

我觉得这些可能性都不令人信服。第一个似乎创造了不必要的开销,而第二个似乎并不优雅(如果它甚至有效,我不确定)。

什么是拆分流的好方法?

2 个答案:

答案 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。