我应该使用带锁定的原子计数器还是可以使用它?
def somefunc(someparam):
if someparam:
dic['key'] +=1
答案 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