我想在 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 负载进程完成它,因为它们会阻塞事件队列(我认为)。
最佳答案
这个怎么样?
- 为慢速进程创建 3 个 worker Verticle,为 firing 进程创建 1 个 main Verticle 和 收集刚刚创建的 worker 的所有结果。
- 在这些 Verticle 之间创建事件总线。
那么整个图就是:
- main Verticle 向这些 worker 发送包含输入的消息(在您的示例中,它正在向 worker 发送 a、b、c,而且 main verticle 应该为 worker 的返回消息注册一个处理程序。)
- worker 获取输入并通过其事件总线将结果返回到主 Verticle
- main verticle 等待 worker 的结果,如果所有结果都返回,那么它可以完成它的工作,否则它可以将结果保存到它的本地缓存并返回。
希望这会有所帮助。
关于java - 如何在 Java 中使用 Vert.X 运行 CPU 密集型并行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21964599/