背景: 我對多進程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,但我擔心這不是正確的方法。
謝謝!到目前爲止,該腳本自11月份開始投入生產,運行良好,但很高興知道它沒有做任何錯事=) – Danalog