保留輸入順序我有一個子系統,看起來像這樣:並行化的任務,但在輸出
[read] [decode] [deliver]
Byte --> Undecoded --> Decoded --> Output queue
stream message message
輸入是一個插座/字節流。第一步是閱讀消息。下一步是解碼消息(並將結果存儲在消息對象中)。最後一步是傳遞信息。
我想並行化解碼步驟,但我必須保持輸出順序與輸入順序相同。所以如果接收到消息A和B並且消息B的解碼更快,我必須等到A完成傳送它。
我在Java中做了一個幼稚的初始實現,但我的分析表明我在切換步驟(從「流式閱讀器」到「解碼器」和從「解碼器」到輸出)中失去了太多。當一個24芯計算機上運行的測試程序(包括超線程)我得到:
- 1100ķ味精/秒運行一個線程執行的時候。
- 當運行一個簡單的12線程實現(有很多 隊列)時,會產生110 K msg/s。
我幼稚的做法可在http://pastebin.com/be1JqZy3這是超過200行的代碼,因此它可能會唯一感興趣的那些誰真的想知道它是如何可能使一個並行版本比串行(提示慢10倍:開始看看類ThreadPoolDecoder)。
有沒有人有執行此類問題時使用的模式/框架,其中工作是連續的(基於流)可以並行化但必須按輸出進行排序?
我看到你手動創建你的線程。你有沒有看過使用ThreadPoolExecutor類? http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html – 2012-04-16 14:46:56