2016-08-23 4 views
4

私はCPython、python2.7について尋ねています。GILに関してpython dictのlen()はアトミックですか?

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

ばかり頼って、ロックをつかんせずに別のスレッドからのdictのサイズを取得することが安全である:私はdictを持っている、とadd()を呼び出すことにより、随時に値を挿入しますいくつかのスレッドが言います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

また、Pythonで '__len __()'が実装されていて、アトミックではない 'dict'ではないものを渡すかもしれません。 – kindall

関連する問題