首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl负责的forking

Perl负责的forking
EN

Stack Overflow用户
提问于 2012-02-09 15:44:00
回答 4查看 2.1K关注 0票数 6

我最近发现了Perl forking,我非常喜欢它。但有一件事让我担心--如果我只是左右拆分进程,这肯定会在某个地方引起一些问题。有没有一种合理的检查,可以用来确保我的小应用程序不会耗尽我机器的所有资源?

以以下示例代码为例:

代码语言:javascript
复制
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+命令要运行,该怎么办?轻率地派生出那么多进程是不明智的。那么应该实现什么样的检查,以及如何实现呢?

)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-09 22:26:01

另外,如果你担心同时产生过多的派生进程,你可以限制它们。

或者使用自己的队列(使用队列来保存"to fork“),或者更好的是,使用Parallel::ForkManager模块,该模块允许您通过构造函数参数限制并发的fork。

代码语言:javascript
复制
use Parallel::ForkManager;
$pm = new Parallel::ForkManager($MAX_PROCESSES);

请注意,ForkManager还将通过提供的"wait*“API为您处理已结束的子进程

票数 7
EN

Stack Overflow用户

发布于 2012-02-09 15:58:47

当子进程退出时,它将向父进程返回一个SIG_CHLD。您将希望收获这些代码,就好像您不这样做,它们将成为进程表中的僵尸,直到脚本末尾对wait的最后一次调用。

Chapter 16 of O'Reilly's Perl Cookbook on Google books提供了大量关于这方面的信息。基本上,您需要在派生子对象时增加一个计数器,并在获取它们时将其减量,而不是派生超过当前运行的子对象的合理最大数量的新对象。

至于“合理的最大值”是什么.这取决于硬件,以及这些派生的进程在做什么。这个问题没有静态的答案,只能说测试您正在做的事情,并查看对机器的性能影响。最好是在营业时间。在告诉系统管理员你在做什么之后。他/她甚至可能会有一些建议。

票数 3
EN

Stack Overflow用户

发布于 2012-02-09 18:48:00

为了确保您不会产生超过系统有效处理能力的进程,您可以使用Parallel::ForkManager之类的模块

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9207100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档