【发布时间】:2012-04-27 21:48:44
【问题描述】:
我有一个如下所示的子系统:
[read] [decode] [deliver]
Byte --> Undecoded --> Decoded --> Output queue
stream message message
输入是一个套接字/字节流。第一步是阅读消息。下一步是解码消息(并将结果存储在消息对象中)。最后一步是传递消息。
我想并行化解码步骤,但我必须保持输出顺序与输入顺序相同。因此,如果收到消息 A 和 B 并且消息 B 的解码速度更快,我必须等到 A 完成才能传递它。
我在 Java 中做了一个幼稚的初始实现,但我的分析表明我在切换步骤(从“流读取器”到“解码器”以及从“解码器”到输出)丢失了太多。在 24 核计算机(包括超线程)上运行测试程序时,我得到:
- 运行单线程实现时为 1100 K msg/s。
- 110 K msg/s 运行一个简单的 12 线程实现(有很多 队列)。
我的幼稚实现可在http://pastebin.com/be1JqZy3 获得。它有超过 200 行代码,所以它可能只会让那些真正想知道如何使并行版本比串行版本慢 10 倍的人感兴趣(提示:开始查看类 ThreadPoolDecoder)。
在执行此类问题时,是否有人可以使用模式/框架,工作在哪里继续(基于流)可以并行化,但必须根据输出进行排序?
【问题讨论】:
-
我看到您手动创建线程。您是否考虑过使用 ThreadPoolExecutor 类? docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/…
标签: java parallel-processing threadpool