如何在Parallel :: ForkManager中获取子进程id?

joe*_*joe -1 parallel-processing perl fork

  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;
Run Code Online (Sandbox Code Playgroud)

执行完毕后,我要去pid是零

0 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3DViewer-2.1.zip is done 

0 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-macosx.dmg is done 

0 = http://prdownloads.sourceforge.net/sweethome3d/SweetHome3D-2.1-windows.exe is done

但现在我真的在想它是否真的在做分叉.为什么我在Parallel :: ForkManager中将所有时间都设为0作为pid?

编辑2

我有2个变化

my $pid = $pm->start ; # do the fork
Run Code Online (Sandbox Code Playgroud)

$$进程ID

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 

但是现在我得到两次.为什么我得到这个?

Nic*_*ong 5

不确定Parallel :: ForkManager实现,但是如果它类似于标准的fork(),则返回0,因为您处于子进程中.Fork只会向父进程返回非零pid.

我忘了添加,在启动调用后给出'和next'代码的行为完全符合预期.

编辑2的注释:

由于您从启动调用中删除了"和下一个",因此父进程也在运行下载.我猜21892是父进程的pid,它将多次遍历循环


edg*_*eis 5

关于Edit2下面的代码:

你变了

my $pid = $pm->start and next;
Run Code Online (Sandbox Code Playgroud)

my $pid = $pm->start ; # do the fork
Run Code Online (Sandbox Code Playgroud)

现在你没有正确地做叉子.虽然以前只有孩子继续执行循环体而父母继续执行下一个,但现在两个都继续执行循环体.因此,您会看到父级的pid(21892)多次执行循环.