2011-11-09 126 views
2

背景: 我對多進程Perl腳本沒有太多經驗。我有一個數據清理過程,需要花費12個小時才能完成,當我調查時,我發現幾乎所有的時間都花在等待FooClient返回數據。我正在研究一個多進程的方式來完成這個任務,並且一位同事通過我之前做的簡單的fork()來推薦Parallel :: Fork :: BossWorkerAsync。我喜歡它,因爲它降低了我的記憶使用量。我是否正確使用Parallel :: Fork :: BossWorkerAsync?

問題: BossWorkerAsync看起來非常整潔,perldoc非常棒,並且在非寫入測試模式下運行非常好,我的執行時間不到一個小時。我唯一的問題是文檔沒有真正解釋共享數據如何與「init_handler => & x」構造設置一起工作。我希望每個工作人員都有自己的FooClient,以避免任何類型的同步問題。我以我認爲正確的方式進行了嘗試,但我對此有點偏執,並且還想確保我以最正確的方式處理這個問題。

代碼:

# The number of children to spawn, modify after performance testing 
Readonly my $CHILDREN => 40; 

# Each child will set their own client 
my $client; 

my $bw = Parallel::Fork::BossWorkerAsync->new(
    work_handler => \&process_keys, 
    init_handler => \&setup_client, 
    worker_count => $CHILDREN, 
); 

send_work($bw); 

while ($bw->pending()) { 
    my $ref = $bw->get_result(); 
    # Do stuff with the result 
} 

$bw->shut_down(); 
exit; 

sub setup_client { 
    $client = FooClient->new(); 
} 

上午我處理,我不想正確共享$客戶端?我保留了與fork()版本相同的處理方式,我在fork()之後設置了$ client,但我擔心這不是正確的方法。

回答

2

是的,你正在使用模塊和init_handler。處理程序在每個子進程中在fork之後被調用,然後進入阻塞選擇循環,等待工作。

我是該模塊的作者。對不起,我花了這麼長時間才注意到這一點,並作出迴應。很高興看到代碼被使用。

乾杯, -joe

+0

謝謝!到目前爲止,該腳本自11月份開始投入生產,運行良好,但很高興知道它沒有做任何錯事=) – Danalog