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

用于n核处理器的Perl分叉队列,perl,parallel-processing,queue,fork,multicore,Perl,Parallel Processing,Queue,Fork,Multicore,我正在写一个类似于建议的应用程序。本质上,我使用Perl通过fork和wait并行管理多个CPU密集型进程的执行。然而,我在一台4核机器上运行,我有更多的进程,所有进程都有非常不同的预期运行时间,这是未知的 最终,估计运行时间并将它们适当地组合起来要比简单地为每个核心使用队列系统花费更多的精力。最终,我希望每个核心都能得到处理,停机时间尽可能少,直到一切都完成。有没有一个更好的算法或机制来实现这一点?我认为这是一个常见的问题/用途,所以我不想重新发明轮子,因为我的轮子可能不如“正确的方式” 作为

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

最终,估计运行时间并将它们适当地组合起来要比简单地为每个核心使用队列系统花费更多的精力。最终,我希望每个核心都能得到处理,停机时间尽可能少,直到一切都完成。有没有一个更好的算法或机制来实现这一点?我认为这是一个常见的问题/用途,所以我不想重新发明轮子,因为我的轮子可能不如“正确的方式”

作为次要的一部分,我宁愿不必导入额外的模块(类似)来实现这一点,但是如果这是最好的方法,那么我会考虑它。 ~z~谢谢

编辑:修复了“此处”链接:感谢

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

有一些适合这类任务的功能

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

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

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

所以你要求我们在这里复制P::FM?!“here”的链接不正确。我认为这个模块可以帮助您理解Perl的全部思想是重用其他人的代码。这通常以模块的形式出现,所以请继续加载它们。它们实际上不会让你付出任何代价。:)谢谢你的建议。我确实看到了使用其他代码的好处,因此首先有一个问题:)由于我的开发/操作环境的性质,我不太愿意使用外部源。它具有高度的分布性和异质性;我需要的解决方案最好是小的,可移植的,版本/依赖性不可知的。。。但这可能是最好的方式,所以我会追求它!非常感谢!我没有听说过,我会调查一下,看看是否能从中找到解决办法。