我应该使用带锁定的原子计数器还是可以使用它?
def somefunc(someparam):
if someparam:
dic['key'] +=1
我应该使用带锁定的原子计数器还是可以使用它?
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_SUBSCR
从字典中检索当前值。在操作码 9 和 15 之间的任何地方(STORE_SUBSCR
将值放回的地方),都可能发生线程切换,并且不同的线程可能已经更新了字典。
Python 的内置结构对于单个操作是线程安全的。GIL(全局解释器锁)负责这一点。但是很难看出一个语句在哪里变成了更多的操作。
添加锁会让您高枕无忧:
def somefunc(someparam):
if someparam:
with lock:
dic['key'] +=1