私はPythonでスレッド化をまったく行ったことがなく、この質問を完全に見知らぬ人として尋ねました。
defaultdict
スレッドセーフかどうか疑問に思っています。説明させてください:
私は持っている
d = defaultdict(list)
これにより、デフォルトで欠落しているキーのリストが作成されます。複数のスレッドが同時にこれを開始したとしましょう:
d['key'].append('value')
最後に、私はで終わるはずです['value', 'value']
。ただし、defaultdict
がスレッドセーフでない場合、チェック後および の前 にスレッド 1がスレッド 2に譲ると、インターリーブが発生し、他のスレッドがリストを作成して追加する可能性があります。if 'key' in dict
d['key'] = default_factory()
d['key']
'value'
その後、スレッド 1d['key'] = default_factory()
が再び実行されると、既存のリストと値が破棄されてスレッド 1が続行され、最終的に['key']
.
defaultdictの CPython ソース コードを調べました。ただし、ロックやミューテックスは見つかりませんでした。文書化されている限り、スレッドセーフではないと思います。
昨夜の IRC で、Python には GIL があり、概念的にはスレッドセーフであると述べた人もいました。Python ではスレッド化を行うべきではないと言う人もいます。私はかなり混乱しています。アイデア?