Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这段代码在python 2.7中是线程安全的吗?_Python_Multithreading_Python 2.7_Dictionary_Augmented Assignment - Fatal编程技术网

这段代码在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的存在是为了确保每个操作码都得到完整的处理,让求值循环自由地对解释器状态进行更改,而不必担心竞争条件。这个从那里跟随链接。谢谢,我知道我可以使用锁。问题是这个特定的操作是否是线程安全的,