2016-09-16 6 views
0

Fredrik Lundhの記事Thread Synchronization Mechanisms in Pythonは、複数のスレッドを操作すると値が不正確になる可能性があることを示しています。スレッディング同期の理解

counter = 0 

def process_item(item): 
    global counter 
    ... do something with item ... 
    counter += 1 

は、その後、それはこれらの事は、スレッドセーフであると言っに行く:

reading or replacing a single instance attribute 
reading or replacing a single global variable 
fetching an item from a list 
modifying a list in place (e.g. adding an item using append) 
fetching an item from a dictionary 
modifying a dictionary in place (e.g. adding an item, or calling the clear method) 

しかし、単に単一のグローバル変数を更新するコードの例ではない、ので、とにかくスレッドセーフでしょうか?

私はここで何が欠けていますか? Pythonで

+0

"Updating"!= "Replacing"更新は以前の状態(読み込み、変更、書き込み)に依存します。置き換えはできません(単なる書き込みです)。また、キーがユーザ定義のオブジェクトである場合( '__eq__'や' __hash__'メソッドが呼び出されるため)、 'dict'を適切に修正することはPythonでは常にスレッドセーフではなく、別のスレッドにGILを渡すこともできますアトミシティを混乱させる)。 – ShadowRanger

答えて

3

コード:

counter = counter + 1 

従って値のルックアップが更新に分離されている:

counter += 1 

は言うと同じです。

+0

ああ、count + = 1は "読み込みと置き換え"ではなく "読み込みと置き換え"とみなされますか? – ealeon

+0

@ealeon: 'count + = 1'は、現在の値の読み込み、変更、および書き戻しが必要な値を更新しています。 – martineau

関連する問題