2017-08-14 60 views
0

我有一個Stream的項目(u32, Bytes)其中整數是在範圍內的索引0..n我想將此流拆分爲n流,基本上過濾由整數。拆分期貨::根據流項目的屬性流分成多個流

我考慮了幾種可能性,其中包括

  • 創建n流的每一個偷窺在底層的流來確定下一個項目是爲它
  • 推動項目n的一個水池,當他們到達,然後再次將接收器的另一側用作流。 (這似乎與 Forwarding from a futures::Stream to a futures::Sink有關。)。

我覺得這兩種可能性都沒有說服力。第一個似乎造成不必要的開銷,第二個不夠優雅(如果它甚至有效,我不確定)。

什麼是分流的好方法?

回答

0

您可以使用channels來表示索引特定的流。你必須產生一個從原始流中拉出的Task並具有Sender s的地圖。

1

在一個點上,我有一個類似的要求,併爲Stream寫了group_by運算符。

我還沒有發佈到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現在將(u32, Stream<Item=Bytes))Stream