dict.pop()
是一个 C 函数调用,这意味着它只执行了 一次 字节码评估。这使得该调用是原子的。__dunder__
特殊方法钩子),但对于默认的 dict
类型,dict.pop()
方法并不会进行回调。实际上,dict.pop()不是原子操作。例如,如果您将对象用作字典的键,则Python必须调用对象的__hash__()实现。但是,您可以使用dict.popitem(),它是真正的原子操作。
d.pop(key, None)
这样的操作时,只有一个线程会得到值,其他线程会得到 None
,对吗?即使两个线程都执行了 hash(key)
,只有一个线程会赢得从字典中删除它的竞争。例如 d.pop(generate_key(), None)
可能不是原子性的,因为 generate_key()
不是原子性的,但从字典中删除仍然是原子性的。 - lumbric