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



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

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

顺便说一句,我宁愿不必导入额外的模块(如Parallel::ForkManager)来实现这一点,但如果这是最好的方法,那么我会考虑。

~谢谢!

编辑:修复"此处"链接:感谢ikegami

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

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

  • 扩展了语法,但没有太多新语法:如果您已经有了一个带有forkwait调用的程序,那么您仍然可以使用Forks::Super的功能,而不会有太多更改。也就是说,您的新代码仍将具有forkwait调用
  • 作业限制:与Parallel::ForkManager一样,您可以控制同时运行的作业数量。当一个作业完成时,模块可以启动另一个作业,使您的系统得到充分利用。您还可以指定更复杂的逻辑,如"在周末或午夜至早上6点之间最多运行6个后台作业,但在其余时间运行2个后台作业">
  • 定时实用程序:Forks::Super跟踪每个作业的开始时间和结束时间,让您可以记录和分析每个作业所用的时间:

    fork { cmd => "some command" };
    ...
    $pid = wait;
    $elapsed = $pid->{end} - $pid->{start};
    print LOG "That job took ${elapsed}sn";
    
  • CPU亲和性控制:我不知道这是否是你需要的,但Guarav似乎认为这很重要。您可以将后台作业分配给特定的核心

    # restrict job to cores #0 and #2
    $job = fork { sub => &background_process, args => @args, 
    cpu_affinity => 0x05 };
    

最新更新