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 );