30 個子進(jìn)程來并行下載不同的鏈接
??
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?個進(jìn)程
?? 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;
?? use ?Parallel :: ForkManager;
??

?? @links = (?
????[ " http://www.foo.bar/rulez.data " , " rulez_data.txt " ] , ?
????[ " http://new.host/more_data.doc " , " more_data.doc " ] ,
????

??);
??

?? # ?同時使用?30?個進(jìn)程
?? 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 對象,同時必須標(biāo)明最大進(jìn)程數(shù)。如果使用 0 的話就可以避免 fork 來達(dá)到調(diào)試程序的作用。
然后使用 $pm->start 來開始 fork。 $pm 在子進(jìn)程時返回 0 ,父進(jìn)程時返回子進(jìn)程的進(jìn)程號(具體請參閱 Perl 的 fork 文檔)?!癮nd next” 用來跳過父進(jìn)程。注意:如果 fork 失敗的話, $pm->start 就提示錯誤,程序結(jié)束。
$pm->finish 結(jié)束子程序(假設(shè)我們一開始使用了 start 來 fork)
注意:在子進(jìn)程中不能使用 $pm->start。 如果你想在子進(jìn)程中使用另外一組子進(jìn)程,你必須再初始化一個 Parallel::ForkManager 對象。
from: http://www.perlchina.org/archive/archive.php?action=archive&page=44
posted on 2006-05-21 20:37 weidagang2046 閱讀(396) 評論(0) 編輯 收藏 所屬分類: Perl