我想在Java中运行CPU密集型并行任务,但为了避免竞争条件的复杂调试,我决定尝试异步程序模型。我有Node.JS的经验,我知道异步的东西是如何工作的,我理解事件循环。我想我不理解Worker Verticles in Vert.x。
想象一下以下具有3个CPU密集型进程的Java代码(方法slowProcess())。
异步模型是否仅用于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个过程和简单的结果处理,线程连接会更好。真正的问题更复杂。我只是想知道是否有人可以将此代码转换为异步版本,或者告诉我为什么不应该使用高CPU加载进程,因为它们会阻塞事件队列(我认为)。
答案 0 :(得分:1)
这个怎么样?
然后整个画面是:
希望这会有所帮助。
答案 1 :(得分:0)
对于给定的用例,只有3个长期进程,线程是最佳选择。只需将slowProcess
包装在一个实现Runnable的类中,并将结果保存在其中。启动线程,使用Thread.join()等待它们,并提取结果。
异步模型不仅适用于I / O操作,也适用于任何具有许多短任务的情况。
答案 2 :(得分:0)
许多MQ模式(特别是zeromq是无故障的)是vertx中可重用的,因为它们共享类似的想法,如pubsub和req / rep通信,现在,在zeromq中你可以使用一个名为ventilator的模式,它允许存档并行计算以一种非常简单的方式
你可以在这里阅读它 http://taotetek.net/2011/02/02/python-multiprocessing-with-zeromq/ http://zguide.zeromq.org/java:taskvent虽然我没有那么多关于vertx的经验我很确定你可以使用Verticle在vertx中应用这个模式