我新发现了Perl fork ,我深爱着。但是有一件事与我有关-如果我只是左右拆分流程,那么这肯定会在某处引起一些问题。是否应该使用一种合理的检查,以确保我的小应用程序不会耗尽我机器的所有资源?
采取以下示例代码:
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多个命令要运行怎么办?漫不经心地分担这么多流程是不明智的。那么应该执行哪种检查,以及如何执行?
)
最佳答案
另外,如果您担心同时产生太多的 fork 进程,则可以限制它们。
要么自己滚动(使用队列来保存“ fork ”的 fork ),要么更好地使用 Parallel::ForkManager
模块,该模块允许您通过构造函数参数限制同时 fork 。
use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);
请注意,ForkManager也将通过提供的“wait *” API来为您收获已结束的子进程