走向並行系列之-使用ForkManager編寫多程式程式

gaorongchao1990626發表於2013-07-26
ForkManager下載地址:
http://search.cpan.org/~dlux/Parallel-ForkManager-0.7.5/ForkManager.pm
fork函式建立程式
關於使用fork建立程式網上有很多優秀的例項,這裡貼上一例,演示新怎樣建立一個新的程式:http://fuzhong1983.blog.163.com/blog/static/1684705201112405432663/
------------------------------------------
下面一段程式的作用是每隔1s建立一個新的程式,每個新建立的程式的作用是sleep(5)
use strict;use warnings;
for (my $i = 0; $i < 10; $i ++) {
    ## ==建立一個新的程式 ==
    my $pid = fork();
#如果建立失敗,退出程式(ps:搞不明白,既然建立了,還能失敗)   
    if (!defined($pid)) {
        print "Error in fork: $!";       
        exit 1;
    }
    if ($pid == 0) {
        ## == child proc ==
        print "Child $i : My pid = $$n";
        sleep(5);
        print "Child $i : endn";
        exit 0;
    }
    sleep(1);
}
exit 0;
關於程式的收割以及程式數量的控制,這裡就不詳述了。因為下面將要介紹一種更簡單的控制程式的方法。

使用ForkManager建立並控制執行緒
先上例項,一句一句分析;
use Parallel::ForkManager;  #申明模組;
use strict;use warnings;
my $MAX_PROCESSES=10;   #申明最大程式數(一次建立的程式越多,越耗記憶體);
my $pm = new Parallel::ForkManager($MAX_PROCESSES);     #建立一個例項;

#共有50個任務需要處理,系統中始終保持處理的程式數為10;
for(my $i=1;$i<=50;$i++){
    #建立一個新進,使用next語句,進入下一個迴圈。每個程式的任務就是呼叫SLEEP函式
    #當建立的程式數達到設定的閾值(10)時,主程式等待,知道有子程式執行完畢,新的程式將被建立;
    my $pid = $pm->start and next; 
    &SLEEP;
    $pm->finish;       #收割程式;
}
$pm->wait_all_children;  #不知道為什麼會有這句,但是是必須的;

sub SLEEP
   sleep(5);
}
使用ForkManager建立程式,算是比較省心的了,我們不用管怎麼來控制程式數量,怎麼等待程式結束然後收割程式。當每個程式執行時間不一致時,ForkManager控制新建的程式逐一新增,最大化利用CPU。

相關文章