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