用于n核处理器的Perl分叉队列
我正在写一个类似于建议的应用程序。本质上,我使用Perl通过fork和wait并行管理多个CPU密集型进程的执行。然而,我在一台4核机器上运行,我有更多的进程,所有进程都有非常不同的预期运行时间,这是未知的 最终,估计运行时间并将它们适当地组合起来要比简单地为每个核心使用队列系统花费更多的精力。最终,我希望每个核心都能得到处理,停机时间尽可能少,直到一切都完成。有没有一个更好的算法或机制来实现这一点?我认为这是一个常见的问题/用途,所以我不想重新发明轮子,因为我的轮子可能不如“正确的方式”用于n核处理器的Perl分叉队列,perl,parallel-processing,queue,fork,multicore,Perl,Parallel Processing,Queue,Fork,Multicore,我正在写一个类似于建议的应用程序。本质上,我使用Perl通过fork和wait并行管理多个CPU密集型进程的执行。然而,我在一台4核机器上运行,我有更多的进程,所有进程都有非常不同的预期运行时间,这是未知的 最终,估计运行时间并将它们适当地组合起来要比简单地为每个核心使用队列系统花费更多的精力。最终,我希望每个核心都能得到处理,停机时间尽可能少,直到一切都完成。有没有一个更好的算法或机制来实现这一点?我认为这是一个常见的问题/用途,所以我不想重新发明轮子,因为我的轮子可能不如“正确的方式” 作为
作为次要的一部分,我宁愿不必导入额外的模块(类似)来实现这一点,但是如果这是最好的方法,那么我会考虑它。 ~z~谢谢
编辑:修复了“此处”链接:感谢 编辑:p::FM太容易使用,而不是。。。今天我学到了。有一些适合这类任务的功能- 扩展语法,但没有太多新语法:如果您已经有了一个带有
和fork
调用的程序,您仍然可以使用wait
的功能,而无需进行太多更改。也就是说,新代码仍将有Forks::Super
和fork
调用wait
- 作业限制:与
类似,您可以控制同时运行的作业数量。当一个作业完成时,模块可以启动另一个作业,从而使系统得到充分利用。您还可以指定更复杂的逻辑,如“在周末或午夜到早上6:00之间最多运行6个后台作业,但在其余时间运行2个后台作业”Parallel::ForkManager
- 计时实用程序:
跟踪每个作业的开始时间和结束时间,让您记录和分析每个作业所用的时间: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 };