Perl 如何并行获取子进程id::ForkManager?

Perl 如何并行获取子进程id::ForkManager?,perl,parallel-processing,fork,Perl,Parallel Processing,Fork,在这个执行之后,我将看到pid为零 use LWP::Simple; use Parallel::ForkManager; @links=( ["http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-windows.exe","SweetHome3D-2.1-windows.exe"], ["http://prdownloads.sourceforge.net/sweethome3d/Sw

在这个执行之后,我将看到pid为零

  use LWP::Simple;
  use Parallel::ForkManager;


  @links=( 
    ["http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-windows.exe","SweetHome3D-2.1-windows.exe"], 
    ["http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-macosx.dmg","SweetHome3D-2.1-macosx.dmg"],
    ["http://prdownloads.sourceforge.net/sweethome3d/SweetHome3DViewer-2.1.zip","SweetHome3DViewer-2.1.zip"],

  );

  # Max 30 processes for parallel download
  my $pm = new Parallel::ForkManager(30); 

  foreach my $linkarray (@links) {
    my $pid = $pm->start and next; # do the fork

    my ($link,$fn) = @$linkarray;
    warn "Cannot get $fn from $link"
      if getstore($link,$fn) != RC_OK;

    print "$pid = $link is done ";

    $pm->finish; # do the exit in the child process
  }
  $pm->wait_all_children;
进程id为$$

my $pid = $pm->start ; # do the fork

但现在我得到了两次。为什么我会得到这个

不确定Parallel::ForkManager实现,但如果它与标准fork类似,则返回0,因为您在子进程中。Fork将只向父进程返回非零pid

我忘了添加,因为start调用后的'and next'代码的行为完全符合预期

编辑注释2:

由于您从开始调用中删除了“and next”,因此父进程也在运行下载。我猜21892是父进程的pid,它将在循环中多次运行

看到那行了吗

21892 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-windows.exe is done 21893 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-windows.exe is done 21892 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-macosx.dmg is done 23120 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-macosx.dmg is done 21892 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3DViewer-2.1.zip is done 23146 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3DViewer-2.1.zip is done 父对象获取pid,子对象将只看到0。如果希望从子进程中获取pid,只需使用神奇变量$$

更新:


对该行的引用并不意味着邀请更改该行。但是看看它,很明显,$pid在下面的代码中是0,所以打印$pid只打印0而不打印其他内容也就不足为奇了。

关于您的代码,请参见Edit2:

你变了

my $pid = $pm->start and next; # do the fork

现在你没有正确地使用叉子。以前只有子级继续执行循环体,父级执行下一个循环体,现在两者都继续执行循环体。因此,您可以看到父级21892的pid多次执行循环

my $pid = $pm->start ; # do the fork

这将为您提供子pid,并继续使用fork处理代码。

@Manni-这之后运行了2次2次?不知道你想说什么。抱歉。如果您看到该进程执行的输出,它将显示其打印2次。但是它应该只显示一次为什么更改$pm->start行??这只是猜测,但可能是平行的:ForkManager正在重用该进程,因为下载已完成?清除最后一条注释,$pm->finish应该退出子进程。但是,由于您从开始调用中删除了“and next”,父进程也在运行下载。我猜21892是父进程的pid,它将在循环中多次运行。@nic字符串-将此信息添加到您的答案中,然后我将接受您的答案:-
my $pid = $pm->start and next;
my $pid = $pm->start ; # do the fork
forloop{
if (my $pid = $pm->start($linkarray)){
              print "pid-i-got-from-child=$pid and this code is running under pid=$$\n";
              next;
            }
... and then continue with code processing in child process...

}