Blog

Parallel::Prefork で子プロセスが死なない場合の対応方法

殺しても死なない子は念入りに殺す必要があるし、死なないなら死なないで死んでないことを記録に残しておく必要がある。

infof("[%d] Worker exiting...", $$);
$0 = "worker master: exiting...";
{
    infof("Remains %d workers", $pm->num_workers);
    local $SIG{ALRM} = sub {
        infof("[%s] wait_all_children timeout. Sending alarm to %s", $$, join(",", sort keys $pm->{worker_pids}));
        $pm->signal_all_children("INT");
        alarm 3;
    };
    alarm 3;
    $pm->wait_all_children();
    alarm 0;
}
infof("[%d] Worker exit", $$);

大きい顔が流れることで有名な kazuho さんに相談したところ、こういうふうに書いたらいいのではないか、という教えを受けたのでブログにまとめたものである。

【追記】 ちょっとシグナルまわり調整。