int*_*ect 2 python multithreading dictionary python-3.x
我dict
在两个线程之间共享。一个线程正在添加和删除条目,另一个线程现在需要迭代该字典并从中派生一些数据。
在 Python 2 中,它items()
会返回一个列表,但不一定会迭代dict
. 在 Python 3 中迭代要修改的 a 的建议方法dict
似乎是迭代list(mydict.items())
,但这似乎只适用于一个线程;另一个线程可能会添加或删除项目,同时list()
仍在返回的字典视图上使用迭代器items()
,对吧?
有一个copy()
方法dict
; 文档并没有建议它可以抛出RuntimeError
类似的字典和字典视图迭代器可以。我可以安全地使用copy()
快照dict
正在被另一个线程修改吗?然后我可以迭代快照。
从定义上来说,dict.copy
必须迭代;您无法在不迭代的情况下复制所有键/值对。
其余的答案取决于您的口译员。这是 CPython 参考解释器上的安全/原子操作(其中 GIL 确保整个copy
操作作为单个字节码的结果发生CALL_METHOD
,并且 GIL 只能在字节码之间释放),但一般没有语言保证支持这一点。如果您的代码可能在具有真正同步线程的无 GIL Python 解释器上运行,则需要使用锁定。
请注意,并非所有看似原子的dict
操作都会以这种方式工作。例如,如果涉及的所有键都是用 C 实现的内置类型,则dict.setdefault
在 CPython 上将是原子的(因此调用它们的and不能返回到解释器循环中,在此期间可以释放 GIL),但它不会适用于在 Python 级别代码中定义/的用户定义类实例。碰巧是安全的,因为:__hash__
__eq__
__hash__
__eq__
dict.copy
dict
,不需要重新计算dict
,因此在构建新密钥时不可能发生冲突dict
(它们针对插入密钥时优化了代码路径,并且保证插入的密钥不等于任何现有密钥,后者只能使用在特殊情况下,例如copy
)。 归档时间: |
|
查看次数: |
103 次 |
最近记录: |