我刚刚发现了Perl forking,我很爱.但有一点让我担心 - 如果我只是左右分离流程,肯定会在某处引起某些问题.是否有合理的检查,以确保我的小应用程序不会占用我的机器的所有资源?
拿这个示例代码:
foreach my $command (@commands) {
my $pid = fork();
if (!$defined $pid) {
#Fork failed. Do something.
} elsif ($pid == 0) { #This is the child.
system($command);
exit(0)
}
}
while (wait() != -1) {} #wait() will be -1 when the last child exits.
Run Code Online (Sandbox Code Playgroud)
所以这将工作正常,并产生一个进程来处理每个命令.它将全部并行发生,如果这些命令完全独立则很好.
如果我突然有5000多个命令可以运行怎么办?不假思索地分开那么多流程是不明智的.那么应该实施什么样的检查,以及如何实施?
)
此外,如果您担心同时产生过多的分叉进程,您可以限制它们.
要么自己滚动(使用队列来保持"分叉"),或者更好的是,使用Parallel::ForkManager允许您通过构造函数参数限制同时分支的模块.
use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);
Run Code Online (Sandbox Code Playgroud)
请注意,ForkManager还将通过提供的"wait*"API为您收集已结束的子进程