我新发现了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来为您收获已结束的子进程

09-11 17:54