-1

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

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

2 回答 2

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将值放回的地方),都可能发生线程切换,并且不同的线程可能已经更新了字典。

于 2016-11-14T16:56:40.437 回答
1

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

添加锁会让您高枕无忧:

def somefunc(someparam):
    if someparam:
        with lock:
            dic['key'] +=1
于 2016-11-14T17:00:49.663 回答