Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在perl Parallel::ForkManager中从数组中删除死子级?_Arrays_Perl_Fork_Daemon - Fatal编程技术网

Arrays 如何在perl Parallel::ForkManager中从数组中删除死子级?

Arrays 如何在perl Parallel::ForkManager中从数组中删除死子级?,arrays,perl,fork,daemon,Arrays,Perl,Fork,Daemon,有人建议我使用Parallel::ForkManager来妖魔化。如您所见,我使用run进行妖魔化 sub run { my ($self) = @_; my $pfm = Parallel::ForkManager->new($self); while(1) { $pfm->run_on_wait( sub { #some code here },sleep(0.0001)); my $pid = $pfm-&g

有人建议我使用
Parallel::ForkManager
来妖魔化。如您所见,我使用
run
进行妖魔化

sub run {
    my ($self) = @_;
    my $pfm = Parallel::ForkManager->new($self);
    while(1) {
       $pfm->run_on_wait( sub {
        #some code here
    },sleep(0.0001));
    my $pid = $pfm->start;
        if ($pid != 0) {
            # Parent process
            push @childs, $pid;
            sleep 1;
            next;
        }
        # Child process; do some work
        $self = &doWork();
        # Worker finished, clean up the $pfm instance
        $pfm->finish();

    }
}

所有子PID都存储在一个数组中
@childs
,如果其中一个死了,循环允许恢复所需数量的子PID,但是数组中有旧的(死的)PID,如何删除它们?在
run\u on\u wait

中的代码中是否可以看到新数组?我认为您误用了
Parallel::ForkManager

它的作用是允许您自动限制一些进程

调用构造函数(
new
)时指定限制

例如:

通常,
$self
用于表示面向对象的调用

run\u on\u wait
方法与您正在做的事情非常相关,因此如果您展示它,它会有所帮助。但我认为您误解了它的用途,因为您在
while
循环的每个迭代中都重新定义了它

run_on_wait$code,[$period]
您可以定义子进程需要等待启动时调用的子例程。如果未定义$period,则每个子级执行一个调用。如果定义了$period,则定期调用$code,模块在两次调用之间等待$period秒。注意,$period也可以是小数。无法保证精确的“$period seconds”(周期秒),信号可以缩短,进程调度程序可以使其更长(在繁忙系统上)。

但它实际上并不打算在其中嵌入
sleep
。它应该包含一个等待延迟,它将运行调用的“wait”代码

但在while循环的每次迭代中重新定义它也没有什么意义。您首先使用
@childs
的目的也不清楚-为什么您需要维护一个PID列表-
Parallel::ForkManager
正在跟踪号码并处理加入/等待您的事宜

如果你出于其他原因需要跟踪你的孩子,那么你可能会发现使用“开始”和“完成”机制更有用

start[$process\u identifier]
此方法不执行fork。它为父进程返回子进程的pid,为子进程返回0。如果构造函数的$processs参数为0,那么假设您在子进程中,$pm->start只返回0。


可以为此方法提供可选的$process\u标识符。。。“run\u on\u finish”回调(请参阅回调)使用它来标识已完成的进程。

为什么要将
$self
传递到Parallel::ForkManager?你想用你的
@childs
实现什么?首先构建数组没有多大意义。您想实现什么?childs中的pids用于dbi中的更新
doWork()
检查数据库中是否有此PID
$self
仅用于设置最大儿童数,这没关系,我可以使用静态变量。非常奇怪的事情-
$self
通常用于表示面向对象的代码。这是我的错,这种方法基于示例,基于OOP,位于
run\u on\u wait
中的代码必须连续执行(无限循环)。它实现一个数据库操作(有两个基)。此代码中使用的子进程的PID。
doWork()
方法来自另一个必须像守护进程一样工作的脚本(检查位于数据库和其他操作中的PID)。您仍然不需要在while循环的每次迭代中重新定义子循环。将其转换为哈希。将pid作为哈希键插入,然后使用
delete
。问题不在于如何从数组中删除,而在于如何确定哪个pid是死的。据我所知,方法
run\u on\u wait
在启动第一个子循环时运行。如何运行它当所需数量的子进程运行时?
run\u on\u finish
在进程完成时运行。您可以在启动进程时嵌入标识。
my $pfm = Parallel::ForkManager -> new ( $n_concurrent );