Python的dict.pop是原子的吗?


问题内容

相信dict.pop原子操作是合理的,因为KeyError如果缺少指定的键并且没有提供默认值,它将引发原子操作,如下所示:

d.pop(k)

但是,文档似乎没有专门针对这一点,至少在专门文档部分中没有dict.pop

当我查看使用此模式的我的答案时,我想到这个问题:

if k in d: del d[k]

当时,我没有想到在期间可能会出现密钥的潜在条件if,但在时却没有del。如果dict.pop确实提供了原子替代方法,那么我应该在回答中指出这一点。


问题答案:

对于默认类型,dict.pop()是C函数调用,这意味着它以 一个 字节码求值执行。这使该调用成为原子操作。

Python线程仅在字节码评估循环允许时才进行切换,因此在字节码边界进行切换。某些Python
C函数确实会回调Python代码(请考虑__dunder__特殊的方法钩子),但是该dict.pop()方法没有,至少对于默认dict类型而言不是。