3

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

想象一下下面的 Java 代码有 3 个 CPU 密集型进程(方法 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;
    }
    }
    

更新/注意:这是一个简化的例子。对于这三个过程和简单的结果处理,线程连接会更好。真正的问题更复杂。我只是想知道是否有人可以将此代码转换为异步版本,或者告诉我为什么不应该使用高 CPU 负载进程来完成它,因为它们阻塞了事件队列(我认为)。

4

3 回答 3

1

这个怎么样?

  1. 为慢速进程创建 3 个 worker verticle,为触发过程创建 1 个 main verticle,并收集刚刚创建的 worker 的所有结果。
  2. 在这些 Verticle 之间创建事件总线。

那么整个画面就是:

  1. 主 verticle 向这些工作人员发送包括输入的消息(在您的示例中,它正在向工作人员发送 a、b、c,主 verticle 还应该注册一个处理程序以从工作人员返回消息。)
  2. 工作人员获取输入并通过其事件总线将结果返回到主 Verticle
  3. main verticle 等待worker的结果,如果所有结果都返回,那么它可以做它的工作,否则它可以将结果保存到它的本地缓存并返回。

希望这会有所帮助。

于 2014-02-24T06:22:39.680 回答
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 没有太多经验,但我很确定您可以使用 verticles 在 vertx 中应用此模式

于 2014-06-02T03:51:12.420 回答
0

对于给定的用例,只有 3 个长时间运行的进程,线程是最佳选择。只需包装slowProcess一个实现 Runnable 并将结果保存在其中的类。启动线程,使用 Thread.join() 等待它们,然后提取结果。

异步模型不仅适用于 I/O 操作,而且适用于任何具有许多短任务的情况。

于 2014-02-23T11:12:30.793 回答