我正在编写一个类似于建议here的应用程序。本质上,我使用Perl通过fork和wait来并行管理多个CPU密集型进程的执行。但是,我在4核机器上运行,而且我有更多的进程,所有进程的运行时间都非常不同,这些运行时间并不是先验的。
最终,需要花费更多的精力来估算运行时间并对其进行适当的组合,而不是简单地为每个核心使用队列系统。最终,我希望每个核心都能在尽可能少的停机时间内进行处理,直到一切都完成。这样做有一个首选的算法或机制吗?我认为这是一个常见问题/使用,所以我不想重新发明轮子,因为我的轮子可能不如正确的方式。 '
作为一个小问题,我宁愿不必导入额外的模块(如Parallel::ForkManager)来完成此任务,但如果这是最好的方法,那么我会考虑它。
〜谢谢!
编辑:已修复此处' link:感谢ikegami
编辑: P :: FM太容易使用,而不是......今天我学到了。
答案 0 :(得分:2)
Forks::Super
有一些适合此类任务的功能。
fork
和wait
次调用的程序,您仍然可以使用{{{{{{ 1}}没有太多变化。也就是说,您的新代码仍会有Forks::Super
和fork
来电。wait
一样,您可以控制同时运行的作业数。当一个作业完成时,模块可以启动另一个作业,从而使您的系统得到充分利用。您还可以指定更复杂的逻辑,例如“在周末或午夜至早上6:00之间运行最多6个后台作业,但在其余时间运行2个后台作业” 计时工具: Parallel::ForkManager
会跟踪每项工作的开始时间和结束时间,让您记录并分析每项工作的时间:
Forks::Super
CPU亲和力控制:我无法判断这是否是您需要的东西,但Guarav似乎认为这很重要。您可以将后台作业分配给特定核心
fork { cmd => "some command" };
...
$pid = wait;
$elapsed = $pid->{end} - $pid->{start};
print LOG "That job took ${elapsed}s\n";