【问题标题】:Parallel::ForkManager leaves a zombie process from last childParallel::ForkManager 从最后一个子进程中留下一个僵尸进程
【发布时间】:2013-05-28 19:41:54
【问题描述】:

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

但是对于这个,我还没有找到任何解决方法。

代码:

[...]
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);
 }

【问题讨论】:

    标签: perl parallel-processing fork zombie-process


    【解决方案1】:

    你不见了

    $pm->wait_all_children;
    

    【讨论】:

    • 我有这个,但这是在一段时间之后,所以当我“轻轻”杀死进程时它会起作用,我应该在里面的某个地方添加它吗?
    • 不,finish 将根据需要在循环内收割。
    • 如您所见,这是行不通的。最后总是
    • 我的意思是start,而不是finish
    • 我已经解释了如何获得这个过程。你错过了$pm-&gt;wait_all_children;
    【解决方案2】:

    可以通过以下代码修复:

    my $pm = Parallel::ForkManager->new(3);
    $SIG{CHLD} = sub{  Parallel::ForkManager::wait_children($pm) };
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-10
        • 2010-11-12
        • 1970-01-01
        • 2016-07-03
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多