【发布时间】:2019-11-27 11:20:17
【问题描述】:
我正在尝试在 Java 中实现这种并发策略。 我真的不在乎我使用的是流还是执行器,这里重要的是效率。
我想在给定的时间期限内并行运行尽可能多的模拟。单个模拟的运行速度比超时快。只要底层线程池有容量,就应该提交新的模拟。
+----------------+ +--------------+ +------------+
| | param | | Solution | |
| SimCoordinator +-------->+ Simulation +----+----->+ reduce(min)|
| | | | | | |
+-------+--------+ +--------------+ | +------------+
^ |
+--------------------------------------+
类看起来像:
class SimCoordinator {
double getParam(); //changes every time
double putSolution(Solution s);
}
class Simulation {
Solution run(double param); // takes a while to compute
}
协调器向任务提供参数。
然后运行任务并获得解决方案。
解决方案必须反馈给协调器,这将改变参数的生成方式。
每个解决方案都有成本;我想以最低成本保存解决方案,并在运行模拟时执行此操作,而不是在截止日期之后。
Simulation.run() 是一个长时间的操作,因此它应该与其他模拟同时运行。假设我有一个 N 个线程的线程池(或者并行流正在工作)。最初,simcoordinator 为所有线程提供模拟,当模拟完成时,它会创建新的。
解决此类问题的最佳方法是什么?
【问题讨论】:
-
您正在描述一个因果循环,不清楚当每个模拟都需要基于前一个模拟的参数时,并行性应该发挥作用。
-
@Holger,抱歉不清楚。 Simulation.run() 是一个长时间的操作,因此它应该与其他模拟同时运行。假设我有一个 N 个线程的线程池(或者并行流正在工作)。最初 simcoordinator 为所有线程提供模拟,当模拟完成时,它会创建新的。我会更新我的问题
-
只需创建一个
Thread Pool和n线程,其中n是您拥有的cpu 核心数... -
所以单个模拟的运行速度应该比超时快得多,所以当有容量时您可能会提交更多?
-
@Holger 完全正确。如果没有超时,模拟将永远提交。
标签: java parallel-processing java-stream java-threads