如何在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负载进程,因为他们阻止事件队列(我认为)。
这个怎么样?
- 为缓慢的过程创build3个工作人员的垂直轴,为发射过程创build1个主垂直轴,并收集刚刚创build的工作人员的所有结果。
- 在这些Verticle之间创build事件总线。
那么整个画面是:
- 主Verticle将包含input的消息发送给这些worker(在你的例子中,它将a,b,c发送给worker,主verticle也应该注册来自worker的返回消息的handler)。
- 一个工人获得一个input,并通过它的事件总线返回结果给主Verticle
- 主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来应用这个模式
- bcryprasynchronous与同步node.js
- 以Layman的术语理解asynchronous代码
- fs.copy失败,大量的图像,less数工作
- JS(node.js) – 如果我进行asynchronous调用,但不等待它完成将保证完成执行?
- 未处理的拒绝错误。 即使testing通过
- 使用嵌套的async.forEachSeries和async.waterfall来控制Lambda Node.js代码的sorting
- 从asynchronous方法返回数据的服务
- 如何在JavaScript中testing基于生成器的stream量控制(ES6)?
- Node.js – asynchronous方法调用问题