프레드릭 룬트 (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)
그러나 단 하나의 전역 변수를 업데이트하는 코드 예제 아니며, 따라서 어쨌든 스레드 안전 할 것인가?
무엇이 여기에 있습니까?
"Updating"! = "Replacing"업데이트는 이전 상태 (읽기, 수정, 쓰기)에 따라 다르며 대체는 아닙니다 (그냥 쓰기 만합니다). 또한,'dict'을 제자리에서 기술적으로 수정하는 것이 키가 사용자 정의 된 객체 인 경우 ('__eq__ 또는 __hash__ '메서드가 호출되기 때문에) 항상 파이썬에서 스레드 세이프가되는 것은 아니며, GIL을 다른 스레드로 전송할 수 있습니다 실행 중이고 원 자성을 방해 함). – ShadowRanger