2016-08-23 44 views
4

我在问CPython,python2.7。说我有一个dict,这将通过调用add()插入值不时线程数:是关于GIL的python dict的len()原子吗?

d = {} 
dlock = threading.Lock() 
def add(key, value): 
    with dlock: 
     d[key] = value 

是否安全得到一个单独的线程的字典的大小,而不敛锁,仅仅依靠在GIL上?

def count(): 
    return len(d) 

假设我不关心怎样恰恰是正确的值,只是在count()是正确的,在某一时刻的任意值。

+0

Dicts没有'insert'方法。 – user2357112

+0

user2357112:谢谢,更正。 – Benno

+0

这个锁看起来有点毫无意义。 'd [key] = value'已经是原子的w.r.t. GIL。 –

回答

1

我不会推荐它,但是,是的,GIL会保护它。在拨打len时,GIL没有机会发布。

+0

你为什么不推荐它? – Benno

+1

@Benno:它将你的程序绑定到CPython,依靠GIL很难说出你需要什么操作是原子的,以及GIL实际保护的是多少。 – user2357112

+1

另外,有人可能会传入一些不是'dict'的东西,它的'__len __()'在Python中实现并且不是原子的。 – kindall