-1

我已经找到了上一个问题的解决方案,但还有另一个问题。

但是为此,我还没有找到任何解决方法。

编码:

[...]
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 时,一切正常,我在进程列表中看到了子进程,但最后一个(总是最后一个)有问题

最后一个子进程始终保持僵尸状态。当我再做一个 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);
 }
4

3 回答 3

2

你不见了

$pm->wait_all_children;
于 2013-05-28T19:51:53.753 回答
2

可以使用以下代码修复它:

my $pm = Parallel::ForkManager->new(3);
$SIG{CHLD} = sub{  Parallel::ForkManager::wait_children($pm) };
于 2015-05-06T13:38:59.920 回答
1

也许您应该让您的子进程休眠一段时间?我对僵尸有类似的问题,但在我的情况下是文件读取,所以孩子们的工作速度比读取下一行文件的速度更快,让他们睡觉解决了僵尸问题。

于 2013-11-20T12:46:20.753 回答