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

想象下面的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;
    }
    }
    

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

    最佳答案

    这个怎么样?

  • 创建3个工作级用于慢速处理,并创建1个主级用于触发处理,
    收集刚刚创建的工作人员的所有结果。
  • 在这些顶点之间创建事件总线。

  • 那么整个图片是:
  • 主verticle将包含输入的消息发送给那些worker(在您的示例中,它正在向worker发送a,b,c,并且main verticle还应注册一个处理程序以接收来自worker的返回消息。)
  • worker 通过其事件总线
  • 获取输入并将结果返回到主verticle
  • 主verticle等待工作程序的结果,如果返回所有结果,则可以完成其工作,否则可以将结果保存到其本地缓存中并返回。

  • 希望这会有所帮助。

    10-04 13:12