??
use
?LWP
::
Simple;
??
use
?Parallel
::
ForkManager;
??
??
@links
=
(?
????[
"
http://www.foo.bar/rulez.data
"
,
"
rulez_data.txt
"
]
,
?
????[
"
http://new.host/more_data.doc
"
,
"
more_data.doc
"
]
,
????
??);
??
??
#
?同時使用?30?個進程
??
my
?
$pm
?
=
?new?Parallel
::
ForkManager(
30
);?
??
foreach
?
my
?
$linkarray
?(
@links
)?{
????
$pm
->
start?and?
next
;?
#
?開始?fork
????
my
?(
$link
,
$fn
)?
=
?@
$linkarray
;
????
warn
?
"
Cannot?get?$fn?from?$link
"
?
??????
if
?getstore(
$link
,
$fn
)?
!=
?RC_OK;
????
$pm
->
finish;?
#
?do?the?exit?in?the?child?process
??}
??
$pm
->
wait_all_children;
首先通過 new 來初始化一個 ForkManager 對象,同時必須標明最大進程數。如果使用 0 的話就可以避免 fork 來達到調試程序的作用。
然后使用 $pm->start 來開始 fork。 $pm 在子進程時返回 0 ,父進程時返回子進程的進程號(具體請參閱 Perl 的 fork 文檔)。“and next” 用來跳過父進程。注意:如果 fork 失敗的話, $pm->start 就提示錯誤,程序結束。
$pm->finish 結束子程序(假設我們一開始使用了 start 來 fork)
注意:在子進程中不能使用 $pm->start。 如果你想在子進程中使用另外一組子進程,你必須再初始化一個 Parallel::ForkManager 對象。
from: http://www.perlchina.org/archive/archive.php?action=archive&page=44