用于n-Core处理器的Perl fork队列

时间:2014-01-10 18:15:45

标签: perl parallel-processing queue fork multicore

我正在编写一个类似于建议here的应用程序。本质上,我使用Perl通过fork和wait来并行管理多个CPU密集型进程的执行。但是,我在4核机器上运行,而且我有更多的进程,所有进程的运行时间都非常不同,这些运行时间并不是先验的。

最终,需要花费更多的精力来估算运行时间并对其进行适当的组合,而不是简单地为每个核心使用队列系统。最终,我希望每个核心都能在尽可能少的停机时间内进行处理,直到一切都完成。这样做有一个首选的算法或机制吗?我认为这是一个常见问题/使用,所以我不想重新发明轮子,因为我的轮子可能不如正确的方式。 '

作为一个小问题,我宁愿不必导入额外的模块(如Parallel::ForkManager)来完成此任务,但如果这是最好的方法,那么我会考虑它。

〜谢谢!

编辑:已修复此处' link:感谢ikegami

编辑: P :: FM太容易使用,而不是......今天我学到了。

1 个答案:

答案 0 :(得分:2)

Forks::Super有一些适合此类任务的功能。

  • 扩展语法,但没有很多新语法:如果您已经有forkwait次调用的程序,您仍然可以使用{{{{{{ 1}}没有太多变化。也就是说,您的新代码仍会有Forks::Superfork来电。
  • 作业限制:与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";