如何在Java中使用Vert.X运行CPU密集型并行任务

我想运行Java运行CPU密集型并行任务,但为了避免比赛条件的复杂debugging,我决定尝试一个asynchronous程序模型 。 我有Node.JS的经验,我知道asynchronous的东西是如何工作的,我理解事件循环。 我想我不明白Vert.x中的工作者Verticles 。

想象下面的Java代码有3个CPU密集型进程(方法slowProcess())。

  • 我怎样才能并行计算a,b和c?
  • 是asynchronous模型适合这个,还是我应该使用正常的线程?
  • asynchronous模型仅用于I / O操作吗?

    public class Race { public static void main(String[] args) throws Exception { long a=0, b=0, c=0; System.out.print("starting ... "); //start the race // these 3 things should run in parallel a = slowProcess(a); b = slowProcess(b); c = slowProcess(c); // this should run after the 3 processes are finished long result =evaluate (a,b,c); System.out.print("finished : "+result); } private static long evaluate(long a, long b, long c) { return a+b+c; } private static long slowProcess(long value) { for (int j = 0; j < 200000; j++) for (int i = 0; i < 200000; i++) { value++; } return value; } } 

更新/说明 :这是一个简单的例子。 对于这3个进程和简单的结果处理,Threadjoin会更好。 真正的问题是更复杂的。 我只想知道,如果有人可以将这个代码翻译成asynchronous版本,或者告诉我为什么不应该用高CPU负载进程,因为他们阻止事件队列(我认为)。

这个怎么样?

  1. 为缓慢的过程创build3个工作人员的垂直轴,为发射过程创build1个主垂直轴,并收集刚刚创build的工作人员的所有结果。
  2. 在这些Verticle之间创build事件总线。

那么整个画面是:

  1. 主Verticle将包含input的消息发送给这些worker(在你的例子中,它将a,b,c发送给worker,主verticle也应该注册来自worker的返回消息的handler)。
  2. 一个工人获得一个input,并通过它的事件总线返回结果给主Verticle
  3. 主Verticle等待worker的结果,如果返回所有的结果,那么它可以完成它的工作,否则它可以将结果保存到本地caching中并返回。

希望这会有所帮助。

对于给定的使用情况,只有3个long-run的进程,线程是最好的select。 只需在实现Runnable的类中包装slowProcess并将结果保存在里面即可。 启动线程,使用Thread.join()等待它们,并提取结果。

asynchronous模型不仅适用于I / O操作,而且适用于任何短任务的情况。

许多MQ模式(特别是zeromq,这是破产less)是可重复使用的内部vertx,因为他们有相似的想法,如pubsub和req / rep沟通,现在,在zeromq内,你可以使用一个名为呼吸机模式,允许归档并行计算在一个漂亮简单的方法

你可以在这里阅读http://taotetek.net/2011/02/02/python-multiprocessing-with-zeromq/ http://zguide.zeromq.org/java:taskvent

虽然我没有太多的vertx经验,但我可以肯定的是,你可以在vertex中使用verticle来应用这个模式