my $collect;
while(($collect = waitpid(-1, WNOHANG)) > 0) {
$kid_proc_num--;
}
}
if($kid_proc_num==0) { last; }
else { next; }
}
以上的代碼采用多進程方式同時處理了對 3 個測試設備的配置操作,然后主進程等待所有配置操作完成,再進行后續的測試。
另外一種情況較為復雜,就是經常需要針對數百個主機和存儲進行配置、狀態查詢等,而且配置結果和查詢狀態需要返回主進程處理,然后根據結果數據再決定如何繼續。對于這種情況,主進程需要生成數百個子進程,而且每個子進程都有大量的信息返回給主進程來處理。這樣處理數百個子進程的生成:由于多進程方式占用系統資源較多,因此設定一個允許主進程同時運行的最多子進程數目,然后在有子進程結束時,主進程再生成新的子進程至所有的子任務完成。這樣處理主進程和子進程的通信和信息交互:由于測試 Perl 腳本運行平臺為 Linux,它是帶有 BSD 風格的 POSIX 兼容的系統,會提供可靠的信號,所以仍然使用系統提供信號的來獲取子進程結束的消息;對于子進程的返回信息,采用為每個子進程產生一個臨時文件用于存儲返回的所有信息,最后主進程來處理這些文件從而獲取每個子任務的結果信息。如下是為這種情況設計的多進程處理方式的軟件流圖。
圖 3. 軟件流圖

下面以登錄每個主機檢查運行狀態的例子給出多進程處理數百個子任務的代碼。
清單 2. 多進程處理數百個子任務
文章來源于領測軟件測試網 http://www.kjueaiud.com/