我最近发现了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.因此,这将很好地工作,并衍生出一个进程来处理每个命令。这一切都是并行进行的,如果这些命令是完全独立的,那就太好了。
如果我突然有5,000+命令要运行,该怎么办?轻率地派生出那么多进程是不明智的。那么应该实现什么样的检查,以及如何实现呢?
)
发布于 2012-02-09 22:26:01
另外,如果你担心同时产生过多的派生进程,你可以限制它们。
或者使用自己的队列(使用队列来保存"to fork“),或者更好的是,使用Parallel::ForkManager模块,该模块允许您通过构造函数参数限制并发的fork。
use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);请注意,ForkManager还将通过提供的"wait*“API为您处理已结束的子进程
发布于 2012-02-09 15:58:47
当子进程退出时,它将向父进程返回一个SIG_CHLD。您将希望收获这些代码,就好像您不这样做,它们将成为进程表中的僵尸,直到脚本末尾对wait的最后一次调用。
Chapter 16 of O'Reilly's Perl Cookbook on Google books提供了大量关于这方面的信息。基本上,您需要在派生子对象时增加一个计数器,并在获取它们时将其减量,而不是派生超过当前运行的子对象的合理最大数量的新对象。
至于“合理的最大值”是什么.这取决于硬件,以及这些派生的进程在做什么。这个问题没有静态的答案,只能说测试您正在做的事情,并查看对机器的性能影响。最好是在营业时间。在告诉系统管理员你在做什么之后。他/她甚至可能会有一些建议。
发布于 2012-02-09 18:48:00
为了确保您不会产生超过系统有效处理能力的进程,您可以使用Parallel::ForkManager之类的模块
https://stackoverflow.com/questions/9207100
复制相似问题