辞書が反復中にiteritems()
を使用してサイズを変更した場合、Pythonは例外を発生させます。はpython dict.items()threadsafeですか?
私のプログラムはマルチスレッドで、別のスレッドがdict
にキーを追加している間、私はdict
を反復処理する必要がある場合があるので、私はこの問題に見舞われています。
幸いにも、dict
のすべての要素に対して非常に正確な反復処理は必要ありません。したがって、私は反復を行うためにiteritems()
の代わりにitems()
を使用することを考えています。私はitems()
は、dict
の静的スナップショットを作成すると私は問題を回避すると思います。
私の質問はitems()
実行時にdict
のサイズが同時に変更されている場合は例外が発生しますか?
おかげ
優れたコメントとして
私のアドバイス:疑問があるときは、ロックを使用してください: – mgilson
おそらくitems()はそのスナップショットの構築の一部として辞書を繰り返し処理する必要があります。 item()を呼び出すと問題は解決しません。問題をコードからitems()メソッドの実装に移すだけです。より良い解決策は、ミューテックスを使用して辞書へのアクセスをシリアライズすることです。 –
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htmはdict.keys()がアトミックであると言っていますが、items()はない。同じ記事では、「L1 [i:j] = L2」は原子であるが、「L [i] = L [j]」ではないということは奇妙なことである。その記事を信頼できますか? – abemaw