30 個子進程來并行下載不同的鏈接
??
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;
?? 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
posted on 2006-05-21 20:37 weidagang2046 閱讀(396) 評論(0) 編輯 收藏 所屬分類: Perl