dictionary.get()
関数を使用すると、辞書全体がロックされていますか?私はマルチプロセスとマルチスレッドプログラムを開発しています。この辞書は、データを追跡するための状態テーブルとして機能するために使用されます。私は辞書にサイズ制限を課さなければならないので、制限が当たったときはいつでも、タイムスタンプに基づいてテーブル上でガベージコレクションを行う必要があります。現在の実装では、ガベージコレクションがテーブル全体を反復しながら、オペレーションの追加が遅れることになります。Python dict.get()Lock
私は2つ以上のスレッドを持っています.1つはデータを追加するだけで、もう1つはガベージコレクションを行います。パフォーマンスは重要です私のプログラムでストリーミングデータを処理する。私のプログラムはストリーミングデータを受信しており、メッセージを受信するたびに状態テーブルでそれを探し、最初に存在しないレコードを追加するか、特定の情報をコピーしてパイプに沿って送信しなければなりません。
私はmultiprocessing
を使用して検索と追加操作を同時に行うことを考えましたが、プロセスを使用すると、各プロセスに状態テーブルのコピーを作成する必要があります。その場合、同期のパフォーマンスオーバーヘッドが高すぎます。そして私はまた、multiprocessing.manager.dict()
が各CRUD操作のためのアクセスをロックしていることを読んでいます。私は現在のアプローチでスレッディングを使用しているので、オーバーヘッドを犠牲にすることはできませんでした。
私の質問は、1つのスレッドがテーブル上で.get()
、del dict['key']
の操作を実行している間に、他の挿入スレッドにアクセスできないようにしますか?
注:私が最もSOのPythonの辞書関連の記事を読んでいるが、私は答えを見つけるように見えることはできません。ほとんどの人は、たとえPython辞書操作がアトミックであっても、ロックを挿入/更新する方が安全だと答えています。私はストリーミングデータの膨大な量を処理しているのでロックする毎回私には適していません。より良いアプローチがあるかどうかアドバイスしてください。
これはあなたの主な質問には対応していませんので、私はコメントしています。競合状態が心配しているときはいつでも、ワンステップ操作を使いたいと思う。 2段階の 'get'から' del'はお勧めできません - 代わりに1段階 'pop'を使います。私はワンステップアプローチでさえあなたの場合に特別な努力をすることなく原子になるとは思わないので、ここでは「原子」という言葉を避けました。 –
コメントありがとうございます。私の場合は、キーが辞書の値の中のすべてのハッシュ値であるように、文法を設計しました。それは実行時に生成され、私はそれらを追跡していません。 popはitemをpopするために* key *を使う必要があります。私は今のところそれを使うことはできないと思う。しかし、2の操作を1に変更することは良い考えです。 –
キーなしで 'get'をどうやって使いますか? –