这段代码在python 2.7中是否是线程安全的?

时间:2016-11-14 16:44:39

标签: python multithreading python-2.7 dictionary augmented-assignment

我应该使用带锁定的原子计数器还是可以使用它?

 def somefunc(someparam):
     if someparam:
        dic['key'] +=1

2 个答案:

答案 0 :(得分:3)

不,您的代码不是线程安全的,因为对字典值使用+=扩充赋值需要执行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_SUBSCR从字典中检索当前值。在操作码9和15之间的任何地方(其中STORE_SUBSCR将值重新放入),可以进行线程切换,而另一个线程可以更新字典。

答案 1 :(得分:1)

Python的内置结构对于单个操作是线程安全的。 GIL(全局解释器锁)负责这一点。但是,很难看出一个陈述在哪里变得更多。

添加锁可以让您高枕无忧:

def somefunc(someparam):
    if someparam:
        with lock:
            dic['key'] +=1