我找到了上一个问题的解决方案,但还有另一个问题。
但为此,我还没有找到任何修复方法。
代码:
[...]
use HTTP::Daemon
use Parallel::ForkManager;
PM with , for example 3 processes MAX
[...]
while (1)
{
$inputcon = $daemon->accept();
$pm->start and next; #fork
do_client_stuff($inputcon);
$pm->finish();
}
当我在这个脚本上做wgets时,一切正常,我看到进程列表中的子进程,但是last(总是有最后一个)有问题
最后一个子进程总是像僵尸一样。 当我做一个更多的wget时,这个僵尸进程正常退出,另一个(这个来自当前的wget查询)成为僵尸
5989 pts/5 S+ 0:00 \_ grep test.pl
5975 pts/4 S+ 0:00 \_ /usr/bin/perl ./test.pl
5987 pts/4 Z+ 0:00 \_ [test.pl] <defunct>
你知道,最后一个孩子的过程总是一个僵尸。 不知道为什么所有进程都正常工作,但最后一步没有。
任何提示,解决方案?
谢谢。
//对不起我的英文
以下是示例代码。 在127:8080上的一个wget使得孩子的过程是一个僵尸。 但脚本正在运行,新查询/新僵尸PID。
#!/usr/bin/perl
use HTTP::Daemon;
use Parallel::ForkManager;
$daemon = new HTTP::Daemon(LocalPort => 8080, LocalAddr => "127.0.0.1", Listen => 64, ReuseAddr => 1) or die "$!";
$pm = Parallel::ForkManager->new(3);
while (1)
{
$inputcon = $daemon->accept();
$pm->start and next;
do_client_stuff($inputcon);
$pm->finish();
}
sub do_client_stuff
{
my ($inputcon) = @_;
$request = $inputcon->get_request;
print $request . "\n";
$inputcon->send_error(403);
}
答案 0 :(得分:2)
你错过了
$pm->wait_all_children;
答案 1 :(得分:2)
可以使用以下代码修复:
my $pm = Parallel::ForkManager->new(3);
$SIG{CHLD} = sub{ Parallel::ForkManager::wait_children($pm) };
答案 2 :(得分:1)
也许你应该让你的孩子进入睡眠状态一段时间?我与僵尸有类似的问题,但在我的情况下,它是文件读取,所以孩子们的工作速度比下一行文件读取速度快,让他们睡觉解决了僵尸问题。