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

时间:2014-02-23 05:28:09

标签: java multithreading node.js asynchronous vert.x

我想在Java中运行CPU密集型并行任务,但为了避免竞争条件的复杂调试,我决定尝试异步程序模型。我有Node.JS的经验,我知道异步的东西是如何工作的,我理解事件循环。我想我不理解Worker Verticles in Vert.x

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

  • 如何平行计算a,b和c?
  • 异步模型是否适用于此,或者我应该使用普通线程吗?
  • 异步模型是否仅用于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加载进程,因为它们会阻塞事件队列(我认为)。

3 个答案:

答案 0 :(得分:1)

这个怎么样?

  1. 为慢速过程创建3个工作者Verticle,为射击过程创建1个主要Verticle 收集刚刚创建的工人的所有结果。
  2. 在这些Verticle之间创建事件总线。
  3. 然后整个画面是:

    1. 主要的Verticle发送包含输入的消息给那些工作者(在你的例子中,它向工人发送a,b,c,主要的Verticle也应该为工人返回消息注册处理程序。)
    2. 工作人员获取输入并通过其事件总线将结果返回到主Verticle
    3. main verticle等待来自worker的结果,如果返回所有结果,那么它可以完成它的工作,否则它只能将结果保存到其本地缓存并返回。
    4. 希望这会有所帮助。

答案 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中应用这个模式