我想知道
我的问题非常具体和简单。例如,我已经有一个本地字典
dict.update()
在Python中是否线程安全。我已经阅读了相关的问题,但没有一个完全回答了我的问题。我的问题非常具体和简单。例如,我已经有一个本地字典
d2
。我只需要像下面展示的那样使用d2
更新全局字典d
。 d
最初为空,并用不同的线程填充。每个线程中的d2
可能与d
具有重叠条目(不认为这很重要)。它是线程安全的吗?import dis
def f(d):
d2 = {1:2, 3:4}
d.update(d2)
print(dis.dis(f))
字节码如下所示:
10 0 LOAD_CONST 1 (2)
2 LOAD_CONST 2 (4)
4 LOAD_CONST 3 ((1, 3))
6 BUILD_CONST_KEY_MAP 2
8 STORE_FAST 1 (d2)
11 10 LOAD_FAST 0 (d)
12 LOAD_ATTR 0 (update)
14 LOAD_FAST 1 (d2)
16 CALL_FUNCTION 1
18 POP_TOP
20 LOAD_CONST 0 (None)
22 RETURN_VALUE
看起来16 CALL_FUNCTION
是更新字典的原子函数。那么它应该是线程安全的吗?
LOAD_ATTR
和CALL_FUNCTION
之外,所有操作都是原子的。这里没有通用原则,只有详细的实现知识。更多信息请参见:https://dev59.com/ploT5IYBdhLWcg3wtBNz#38320815 - Tim PetersCALL_FUNCTION
只是开始调用;您仍然需要考虑函数本身的字节码(或其实现)*。 - chepner