【发布时间】:2014-11-19 16:55:06
【问题描述】:
有人建议我使用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_on_wait 的代码中可见。
【问题讨论】:
-
你为什么将
$self传递给Parallel::ForkManager?你想用@childs完成什么? -
一开始就构建数组没有多大意义。你想完成什么?
-
@childs中的 pids 用于 dbi 中的update。doWork()检查数据库中的这个 pid。$self仅用于设置最大孩子数,没关系,我可以使用静态变量。 -
很奇怪的事情——
$self通常用于表示面向对象的代码。 -
我不好,这个方法基于example,who based for oop