2016-09-16 4 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) 

그러나 단 하나의 전역 변수를 업데이트하는 코드 예제 아니며, 따라서 어쨌든 스레드 안전 할 것인가?

무엇이 여기에 있습니까?

+0

"Updating"! = "Replacing"업데이트는 이전 상태 (읽기, 수정, 쓰기)에 따라 다르며 대체는 아닙니다 (그냥 쓰기 만합니다). 또한,'dict'을 제자리에서 기술적으로 수정하는 것이 키가 사용자 정의 된 객체 인 경우 ('__eq__ 또는 __hash__ '메서드가 호출되기 때문에) 항상 파이썬에서 스레드 세이프가되는 것은 아니며, GIL을 다른 스레드로 전송할 수 있습니다 실행 중이고 원 자성을 방해 함). – ShadowRanger

답변

3

파이썬 코드 :

counter += 1 

말하는 것과 동일하다 :

counter = counter + 1 

따라서 값 조회 업데이트와 별개이다.

+0

오 카운트 + = 1은 "읽기 또는 바꾸기"가 아닌 "읽기 및 바꾸기"로 간주됩니까? – ealeon

+0

@ealeon :'count + = 1'은 현재 값을 읽고, 변경하고, 다시 쓰는 것을 요구하는 값을 갱신하고 있습니다. – martineau