6

私はさまざまなスレッドを持っており、処理後にデータを共通のリストに入れます。リストまたはnumpy配列に単一のスレッドのみがアクセスできるようにするために、Pythonに組み込まれているものはありますか? 第二に、そうでない場合、それを行うためのエレガントな方法は何ですか?

4

3 に答える 3

5

Pythonのスレッド同期メカニズムによると、リストから1つのアイテムを読み取り、その場でリストを変更することは、アトミックであることが保証されています。これが正しい場合(キューモジュールの存在自体によって部分的に矛盾しているように見えますが)、コードがすべての形式である場合:

try:
   val = mylist.pop()
except IndexError:
   # wait for a while or exit
else:
   # process val

そして、入れられるすべてmylistはによって行われ.append()、あなたのコードはすでにスレッドセーフです。そのスコアでその1つのドキュメントを信頼できない場合は、queue.queueを使用してください。これは、すべての同期を行い、list並行プログラムよりも優れたAPIを備えています。特に、無期限にブロックするか、タイムアウト.pop()します。その間にスレッドが処理できるものが他にない場合は、動作するのを待ちます。

numpy配列の場合、および一般にプロデューサー/コンシューマーキュー以外が必要な場合は、LockまたはRLockfromを使用します。threadingこれらはコンテキストマネージャープロトコルを実装しているため、使用は非常に簡単です。

with mylock:
    # Process as necessarry

そして、Pythonは、ブロックの終わりから外れるとロックが解放されることを保証しwithます。これには、何かが例外を発生させた場合などのトリッキーな場合も含まれます。

最後に、multiprocessingアプリケーションに適しているかどうかを検討してください。Pythonのthreadingスレッドは実際に同時に実行されることが保証されておらず、CPythonではCレベルのコードにドロップした場合にのみ実行できます。multiprocessingこの問題を回避できますが、余分なオーバーヘッドが発生する可能性があります。まだ読んでいない場合は、ドキュメントを読んで、どちらがニーズに適しているかを判断する必要があります。

于 2012-06-19T08:14:39.890 に答える
4

threadingLockクリティカルセクション全体を保護する必要がある場合、またはQueueモジュールがスレッドセーフなキューを提供する場合は、オブジェクトを提供します。

于 2012-06-19T07:57:18.960 に答える
1

標準ライブラリQueueはどうですか?

于 2012-06-19T07:51:37.737 に答える