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

标签 java multithreading node.js asynchronous vert.x

我想在 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 个过程和简单的结果处理,Thread joining 会更好。真正的问题要复杂得多。我只是想知道是否有人可以将这段代码翻译成异步版本,或者告诉我为什么不应该用高 CPU 负载进程完成它,因为它们会阻塞事件队列(我认为)。

最佳答案

这个怎么样?

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

那么整个图就是:

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

希望这会有所帮助。

关于java - 如何在 Java 中使用 Vert.X 运行 CPU 密集型并行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21964599/

相关文章:

java - Google Vision API java客户端: how to set API credentials explicitly in code(without using environment variable)

java - 同时播放多个剪辑android studio - 使用线程?

javascript - 用 promise 解决游标问题

Node.js 请求内存泄漏

java - 启用 Intellij IDEA 对 java 类名中的非标准字符的支持

java - 在 JavaEE 中创建 Web 服务

java - 如何使用 jQuery 设置输入值?

java - 构造函数是否同步直至完全完成?

c++ - 处理中断时如何返回主 GUI 线程?

node.js - 使用 elasticsearch 客户端时主机 header 无效