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
但是现在我得到两次.为什么我得到这个?
不确定Parallel :: ForkManager实现,但是如果它类似于标准的fork(),则返回0,因为您处于子进程中.Fork只会向父进程返回非零pid.
我忘了添加,在启动调用后给出'和next'代码的行为完全符合预期.
编辑2的注释:
由于您从启动调用中删除了"和下一个",因此父进程也在运行下载.我猜21892是父进程的pid,它将多次遍历循环
关于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)多次执行循环.