2011-11-09 33 views
2

背景: 私はマルチプロセスのPerlスクリプトで多くの経験がありませんでした。私は完了までに12時間以上かかるFooServiceのためのデータクリーンアッププロセスを持っており、私が調査したとき、私はその時間のほとんどがFooClientが私のデータを返すのを待つことに費やされていることを発見しました。私はその作業を行うためのマルチプロセスの方法を検討していました。同僚は前にやっていた単純なfork()よりParallel :: Fork :: BossWorkerAsyncを推奨しました。私はそれが私の記憶使用を1トン引き下げたのでそれが好きだった。Parallel :: Fork :: BossWorkerAsyncを正しく使用していますか?

問題: BossWorkerAsyncはきれいに見えますが、perldocは素晴らしいです。ノーライトテストモードで実行すると、実際にうまく動作し、1時間以内に実行時間が短縮されます。私の唯一の問題は、ドキュメントでは、 "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()バージョンと同じような取引を続けましたが、これを行うのは正しい方法ではないと心配しています。

答えて

2

はい、モジュールとinit_handlerを正しく使用しています。ハンドラはブロッキング・セレクト・ループに入る前に、各子内でフォークの直後に呼び出され、ジョブを待機します。

私はモジュールの作成者です。申し訳ありませんが、これに気付くまでにはずっと時間がかかりました。コードが使用されているのがうれしいです。

乾杯、 -joe

+0

ありがとう!今のところ、スクリプトは11月から生産されており、うまく動作していますが、何も間違っていないことを知ってうれしいです= – Danalog

関連する問題