14

次のように、指定されたキーが欠落しており、デフォルトが提供されていない場合に発生するdict.popため、アトミックに動作すると考えるのが妥当と思われます。KeyError

d.pop(k)

ただし、ドキュメントは、少なくとも具体的にドキュメント化するセクションでは、その点に具体的に対処していないようdict.popです。

この質問は、このパターンを使用した私の回答を確認していたときに発生しました。

if k in d: del d[k]

その時、キーが の間に存在する可能性があるという潜在的な状態については考えてifいませんでしたが、 の時点ではそうではありませんでしたdel。実際にアトミックな代替手段を提供している場合dict.popは、私の答えに注意する必要があります。

4

2 に答える 2

31

デフォルトの型dict.pop()は C 関数呼び出しです。これは、1 つのバイトコード評価で実行されることを意味します。これにより、その呼び出しがアトミックになります。

Python スレッドは、バイトコード評価ループで許可された場合にのみ切り替えられるため、バイトコード境界でのみ切り替えられます。一部の Python C 関数は Python コードにコールバックしますが (__dunder__特別なメソッド フックを考えてください)、メソッドはコールバックしdict.pop()ません。少なくとも既定のdict型の場合はそうではありません。

于 2013-06-26T16:55:37.303 に答える
4

実際には dict.pop() はアトミックではありません。たとえば、オブジェクトを dict のキーとして使用している場合、Python はオブジェクトの __hash__() 実装を呼び出す必要があります。しかし、真にアトミックな dict. popitem() を代わりに使用できます。

于 2014-03-23T19:40:06.637 に答える