4

我有一个启动 10 个线程的函数调用。在这些线程开始之前,我有

from collections import defaultdict
output = defaultdict(dict)

并且输出为空。

每个线程都会生成数据写入字典。

就像是:

output['water'] = 'h20'
output['fire'] = 'delta of oxygen'
....

线程只会添加项目,它们不会迭代任何其他项目或修改任何其他项目。output['water']是一个不同于 的项目output['fire']。我还可以保证没有两个线程会创建相同的项目。也就是说,每个线程 T 都有一个唯一的 i。在代码中: output[i] 每个线程都是唯一的。

这个字典线程在这方面安全吗?

4

1 回答 1

3

是的。

如果您使用 CPython 和字符串作为键,那么可以。CPython 中的 GIL 确保一次只有一个线程执行字节码,并且将键设置为 dict 中的值发生在单个操作码中STORE_SUBSCR。如果您没有使用 CPython,或者您使用的是具有自定义、、或方法的键__hash____eq__那么__cmp__所有的赌注都是关闭的。如果我有一个肥皂盒,我会跳上它并警告你依赖这样的实现细节来保证正确性的弊端。编写仅适用于案例和将要使用它的环境的东西更适合您,因为否则可能会被视为过早的优化。享受你的工作代码!

>>> from dis import dis
>>> dis(compile('output = defaultdict(dict); output["water"] = "H2O"', 'example', 'exec'))
  1           0 LOAD_NAME                0 (defaultdict)
              3 LOAD_NAME                1 (dict)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 STORE_NAME               2 (output)
             12 LOAD_CONST               0 ('H2O')
             15 LOAD_NAME                2 (output)
             18 LOAD_CONST               1 ('water')
             21 STORE_SUBSCR
             22 LOAD_CONST               2 (None)
             25 RETURN_VALUE

这已在别处讨论过

于 2014-03-27T17:13:15.573 回答