私は異なるスレッドを持っており、処理後に共通のリストにデータを入れます。リストのためにPythonで構築されたものや、単一のスレッドだけがアクセスできる配列がありますか?第二に、それを行うのエレガントな方法は何ですか?Pythonのリストを同期するには?
答えて
標準ライブラリはどうですか。Queue?
Thread synchronisation mechanisms in 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の配列の場合
、とあなたはプロデューサ/コンシューマキューよりも多くを必要とする一般的にはどのような場合でも、threading
からLock
またはRLock
を使用する - これらは、コンテキストマネージャプロトコルを実装するので、それらを使用することは非常に簡単です:
with mylock:
# Process as necessarry
そして、pythonはwith
ブロックの終了時にロックが解放されたことを保証します。例外を発生させるような場合など、トリッキーなケースを含みます。
最後に、threading
よりもアプリケーションに適しているかどうかを検討してください。Pythonのスレッドは実際には同時に実行されることは保証されていません。また、CPythonではCレベルのコードにドロップできます。 multiprocessing
はその問題を回避しますが、余分なオーバーヘッドが発生する可能性があります。まだお持ちでない場合は、ドキュメントを読んでニーズに適したものを判断する必要があります。
- 1. は同期リスト
- 2. Pythonスレッドを同期するには?リストから1つの添付、別のpoping:
- 3. EntityFrameworkでDTOのリストを同期する
- 4. 同期項目リストは、
- 5. Pythonスラックボットを非同期にする
- 6. リストのリストをPythonの同じグラフにプロットする
- 7. Python:同じリストにリストを追加
- 8. ソケットプログラミングPythonの同期
- 9. Pythonスレッド同期
- 10. 非同期Python
- 11. pythonのftplibでディレクトリを同期する
- 12. リストとモデルの同期化
- 13. 長期実行Pythonサブプロセスの出力を非同期でキャプチャするには
- 14. Python非同期プロキシステータスチェック
- 15. 非同期Pythonクラス
- 16. Python - 非同期ロギング
- 17. Celery Python同期タスク
- 18. 非同期に非同期にPython呼び出しリモートオブジェクトメソッド
- 19. Meteor.methodsを同期非同期にする
- 20. Pythonでのスレッドの同期
- 21. 文字列のリストをファイルに保存して同期する
- 22. 2つの非同期リストを辞書に追加する
- 23. Pythonで非同期ジェネレータを作成するには?
- 24. スレッドをPythonと同期して実行するには?
- 25. Pythonはリスト内の項目を初期値にリセットします
- 26. 非同期のURLオープナー(Python)
- 27. 非同期Pythonテレグラムのローカライゼーション
- 28. リストをPythonの特定の値に初期化する方法
- 29. どのようにPythonで同期オブジェクトの反復と非同期コードを組み合わせるには?
- 30. 抽象メソッドPythonでの非同期と同期の実装
は 'mylist.pop(0)' atmoicですか? – willsteel
'with mylock:'リマインダーをありがとう。 Imho RLocksは、オブジェクト指向プログラミングのクリティカルセクションを保護するために、この方法を使用することがよくあります。 – jjmontes
@willsteelの回答が確定しているので、リストがどのように実装されているのかPythonのソースコードを見てみることをお勧めしますが、 'mylist.pop()'が(これも私は明確に答えることができません。そのため、他の同期メソッドについても言及していますが、これはPythonの実装全体でも変更される可能性があります)。特に、CPython *のすべてのCレベルのコードは、GILによって保護されるかもしれません(しかし、それをリリースするオプションがあります)。 'pop'(たぶん)は引数にかかわらずGILを解放するかどうかを指定します。 – lvc