1

問題の仕様:

私はPythonでいくつかの複雑なタスクを実行していますが、それを高速化するために、pythonsマルチプロセッシングライブラリを使用することにしました。それはかなりうまくいきましたが、しばらくして、私はロックがどれくらいの時間、私が使用し、消費し、プロセスがお互いをブロックしているのか疑問に思い始めました。

プロセスの構造は次のとおりです。

プロセス間の共有リストを更新する1つのプロセス。データ更新のコードは次のようなものです。

lock.acquire()
list_rex[0] = pat.some_list
list_rex[1] = pat.some_dictionary
lock.release()

ここで、list_rexとlockはによって定義されます

list_rex = manager.list([[some_elements], {some_elements}])
lock = multi.Lock()

そして、いくつかのプロセスがあり、それらは時々、これらのリストで自分のメモリスペースを更新します。コードは次のとおりです。

lock.acquire()
some_list = list_rex[0]
some_dict = list_rex[1]
lock.release()

some_listとsome_dictは何らかの形で関連しているため、プロセスがsome_dictとは異なる更新からsome_listに情報を持つことを許可できません。

そして私の質問は、メソッドacquire()とrelease()はどれくらい速いのかということです。私の場合、数秒、場合によっては数ミリ秒以内に呼び出すことができます。および/または私の場合、ロックの使用を回避する方法はありますか?

お時間をいただきありがとうございます。

編集:あなたのコメントを検討した後、私の質問はおそらくあるはずです-プロキシリストは私の計算にどのように影響しますか?私は「some_list」と「some_dict」を更新後に読むために本当にたくさん使用します。

4

1 に答える 1

1

リーダーライターロック、リストと辞書の両方に1つのオブジェクトを一緒に使用した場合はロックを必要としないアトミック参照割り当て、および何かを変更する前のパフォーマンスの測定に関するその他の事項を含む、非常に複雑な回答を書き込もうとしていました...

しかし、それから私はあなたが実際にあなたの錠で何をしているのかを見るのに少し時間がかかりました....本質的にはいくつかの参照割り当てにすぎません。どちらもブロックしていないか、I / Oを実行していないか、または「遅い」ものです。これは、いくつかの変数の割り当てです。したがって、簡単な答えは、ロックの取得/解放はおそらく無視できるということです。1秒間に数百回のスレッドにまたがってロックを入力しない限り、影響はごくわずかです。しかし、私の言葉を信じないでください-それを測定してください。

list_rexがロック内で更新されているときに、some_listとsome_dictがロック外の他のプロセスによって参照されている場合に何が起こるかについてもっと心配しています。

于 2013-02-10T12:15:49.313 に答える