这段代码在python 2.7中是线程安全的吗?
我应该使用带锁的原子计数器还是可以使用这个这段代码在python 2.7中是线程安全的吗?,python,multithreading,python-2.7,dictionary,augmented-assignment,Python,Multithreading,Python 2.7,Dictionary,Augmented Assignment,我应该使用带锁的原子计数器还是可以使用这个 def somefunc(someparam): if someparam: dic['key'] +=1 不,您的代码不是线程安全的,因为对字典值使用增强赋值需要执行3个操作码: >>> dis.dis(compile("dic['key'] += 1", '', 'exec')) 1 0 LOAD_NAME 0 (dic)
def somefunc(someparam):
if someparam:
dic['key'] +=1
不,您的代码不是线程安全的,因为对字典值使用增强赋值需要执行3个操作码:
>>> dis.dis(compile("dic['key'] += 1", '', 'exec'))
1 0 LOAD_NAME 0 (dic)
3 LOAD_CONST 0 ('key')
6 DUP_TOPX 2
9 BINARY_SUBSCR
10 LOAD_CONST 1 (1)
13 INPLACE_ADD
14 ROT_THREE
15 STORE_SUBSCR
16 LOAD_CONST 2 (None)
19 RETURN_VALUE
位置9处的操作码,
BINARY\u SUBSCR
从字典中检索当前值。在操作码9和15之间的任何位置(其中STORE\u SUBSCR
将值放回),都可能发生线程切换,不同的线程可能已经更新了字典。Python的内置结构对于单个操作是线程安全的。GIL(全局解释器锁)负责这个问题。但很难看出语句在哪里变得更容易操作
添加锁会让您安心:
def somefunc(someparam):
if someparam:
with lock:
dic['key'] +=1
谢谢这就是我需要知道的,我知道dic是线程安全的,但我不确定+=@OlzhasShaikenov:字典不一定是线程安全的;如果要存储的对象是定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
和/或的Python定义类的实例,然后,解释器将在存储对象时执行这些方法,并可以进行线程上下文切换。这与我从一般阅读中了解到的GIL及其目的并不一致。那么,它的目的是使单个操作码线程安全吗?在这种情况下,我可以搜索一些特定的东西来理解GIL吗?@roganjosh是的,GIL的存在是为了确保每个操作码都得到完整的处理,让求值循环自由地对解释器状态进行更改,而不必担心竞争条件。这个从那里跟随链接。谢谢,我知道我可以使用锁。问题是这个特定的操作是否是线程安全的,