![](/img/trans.png)
[英]How can I asynchronously handle stream events in Node.js while preserving order?
[英]How to make concurrent Node.js stream processing while preserving order?
我有一個使用流的復雜數據處理管道,其中有一個可讀流input
,一個可寫流output
以及一系列轉換流(我們將它們稱為step1
, step2
, step3
和step4
)。 雖然step1
, step3
和output
是無狀態的,但僅依靠進入的數據塊來產生輸出,而塊, step2
和step4
塊是聚合步驟,從多個塊中收集數據以產生其輸出,並且輸出經常重疊在時間方面(例如,chunk1,chunk3和chunk5可能產生output1,chunk2和chunk4可能產生output2,依此類推)。
當前,管道的結構如下:
input.pipe(step1).pipe(step2).pipe(step3).pipe(step4).pipe(output);
這個管道在計算上非常昂貴,因此我想將其拆分為多個實例,最好在多個內核上運行 。 Node.js流保證了順序的保留,因此Node.js似乎平衡了消息傳遞,使得首先從一個步驟出來的數據塊首先傳遞到下一步,而這是我在任何方法上都需要具備的屬性我想出了使計算並發的方法。
我絕對不是要手動操作,更多的是是否有人以前曾解決過此問題,以及這種方法所使用的一般方法。 我不太確定從哪里開始。
盡管我還無法完成訂單保存,但是我支持的流框架scramjet可以使您真正接近實現目標。
我將在這里向您介紹最佳解決方案:
let seq = 0;
source.pipe(new DataStream())
.map(data => {data, itr: seq++}) // mark your order
.separate(x => x % 8) // separate into 8 streams
.cluster((stream) => { // spawn subprocesses
// do your multi threaded transforms here
}, {threads: 8})
.mux((a, b) => a.itr - b.itr) // merge in the order above
在某些時候,我將介紹重新排序,但是為了保持抽象,我不能使用太多的快捷方式,但是您可以像上面示例中count的2 ^ 52限制那樣使用您的快捷方式(seq將用完位空間來遞增然后)。
這將引導您尋求解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.