我正在实现一个模块,其中我的主进程生成一组并行和顺序子进程(任务)来完成其工作。任务本身主要是从各种来源获取数据并执行计算。一些是CPU-而另一些是IO绑定。
当前实现在多个步骤中使用Java Executor / Completion服务来实现此目的。此流程工作流程的示例可以描述如下:
任务A1 ---------------->
Task0 - >任务A2 ---------------->
任务A3 - >任务B1 - >任务C(将所有任务的结果组合起来生成输出)
任务B2 - >
任务A4 --------------->
任务A1
- A4
并行运行,任务B1
和B2
也是如此。最后,任务C
取决于编译最终输出的所有任务A
和B
。
使用Executor服务构建它似乎不是很干净,我一直在寻找更好的方法来执行此操作,因为这些任务依赖性可能随着时间的推移而变化或增加复杂性并且Futures
和{{1}随着时间的推移,管理它们会变得更加丑陋。
我一直在探讨这个话题,并且遇到了反应式扩展和 actor模型框架。 Akka对此似乎有点过分,而高级别的RxJava似乎是一种合理的选择,由于其基于流/事件的处理模式,它可以简化并使设计更具可扩展性。
RxJava Threading Examples中的一些例子看起来也很有希望。
我来这里寻求社区的一些建议,看看这是否是正确的方法,以及是否有其他方法/更好的框架来解决这些问题。
=============================================== ================================================== ====
使用JGraphT编写以下内容,但仍需要弄清楚如何重用线程池。在这种情况下,我最终为每个请求创建新的线程执行器。在此处发布代码的主要部分,以便了解该方法。
Callable
答案 0 :(得分:1)
Rx-Java在这里是一个很好的选择,因为它旨在构建复杂的消息流,在应用程序内部分叉和连接并行执行(只是另一个编译依赖项)。虽然CPU绑定任务最终可能会有一个简单的回调,但IO绑定需要异步IO支持(您也可以使用rx-java自己完成)。
Akka和Vert.x是构建应用程序的完整框架,而Rx-Java只是一个将异步函数式编程的优势带入应用程序的库。