2016-08-23 45 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