因此,我有一個perl腳本,它出去了,並且有一個流的片斷(我不知道有多少片有預付)如何在此代碼中停止分叉
但我想不出知道何時停止wget'ing的好方法。現在如果wget返回失敗,我們創建一個名爲「end」的文件,一旦主程序看到它,它就會停止循環。有沒有更好的方式去做這件事?
很明顯,如果順序完成而不是同時完成,很簡單,但我試圖使其下載速度最快。
my $link = $ARGV[0];
my ($url) = $link=~ m/(.+-)\d+.ts/i;
my $num = 0;
#while the file END doesn't exist
my @pids;
while (! -e "END") {
#create the URL, increment by 1
my $video=$url.++$num.".ts";
die "could not fork" unless defined (my $pid = fork());
#child process goes until wget returns invalid, create END
if (not $pid) {
system ("wget -T 5 -t 5 $video");
`touch END` if $? != 0;
exit;
}
push @pids, $pid;
}
#parent process still running, waiting for the same END file.
for my $pid (@pids) { waitpid $pid,0; }
print "pids finished\n";
sleep 1;
`rm END`;
感謝您的信息,我會做一些研究。我不知道有多少文件到一個特定的流,所以現在我去,直到wget失敗。但你說得對,我應該考慮服務器而不是轟炸它。我跑過去的最後一個是超過357件視頻。它確實下載真的很快。 – genx1mx6
@ genx1mx6我希望它可以幫助,即使它主要列出方法。我打算用'P :: FM'添加代碼(現在已經晚了)。父母只是簡單地通過循環,以便357被立即創建,並且您可能會立即觸及服務器。必須有更多,因爲它需要父母沒有時間在下一個迭代中再次分叉,所以它只是繼續旋轉它們。即使一個人失敗,也可能有一大堆人試圖下載其他不存在的文件。順便說一句,你使用的文件是好的 - 但你需要限制的數量。 – zdim
@ genx1mx6我用'Parallel :: ForkManager'添加了一個工作示例。我也可以爲其他方法添加代碼,但請告訴我這是怎麼回事。 – zdim