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
类型而言不是。