私はさまざまなスレッドを持っており、処理後にデータを共通のリストに入れます。リストまたはnumpy配列に単一のスレッドのみがアクセスできるようにするために、Pythonに組み込まれているものはありますか? 第二に、そうでない場合、それを行うためのエレガントな方法は何ですか?
3 に答える
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
またはRLock
fromを使用します。threading
これらはコンテキストマネージャープロトコルを実装しているため、使用は非常に簡単です。
with mylock:
# Process as necessarry
そして、Pythonは、ブロックの終わりから外れるとロックが解放されることを保証しwith
ます。これには、何かが例外を発生させた場合などのトリッキーな場合も含まれます。
最後に、multiprocessing
アプリケーションに適しているかどうかを検討してください。Pythonのthreading
スレッドは実際に同時に実行されることが保証されておらず、CPythonではCレベルのコードにドロップした場合にのみ実行できます。multiprocessing
この問題を回避できますが、余分なオーバーヘッドが発生する可能性があります。まだ読んでいない場合は、ドキュメントを読んで、どちらがニーズに適しているかを判断する必要があります。
標準ライブラリQueueはどうですか?