는 : http://docs.python.org/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe변수 스왑은 파이썬에서 원자 적으로 보장됩니까? 다음 링크를 참조
나는 다음과 같은 경우 알고 싶어 :
(x, y) = (y, x)
이 CPython의에서 원자 보장됩니다. (x와 y는 모두 파이썬 변수입니다)
는 : http://docs.python.org/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe변수 스왑은 파이썬에서 원자 적으로 보장됩니까? 다음 링크를 참조
나는 다음과 같은 경우 알고 싶어 :
(x, y) = (y, x)
이 CPython의에서 원자 보장됩니다. (x와 y는 모두 파이썬 변수입니다)
은 보자 :
>>> x = 1
>>> y = 2
>>> def swap_xy():
... global x, y
... (x, y) = (y, x)
...
>>> dis.dis(swap_xy)
3 0 LOAD_GLOBAL 0 (y)
3 LOAD_GLOBAL 1 (x)
6 ROT_TWO
7 STORE_GLOBAL 1 (x)
10 STORE_GLOBAL 0 (y)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
그들이 원자 걸 나타나지 않습니다 : x와 y의 값 사이에 다른 스레드에 의해 변경 될 수 있습니다 LOAD_GLOBAL
바이트 코드, ROT_TWO
전후, 및 STORE_GLOBAL
바이트 코드 사이에 존재한다.
두 변수를 원자 적으로 교환하려면 잠금 또는 뮤텍스가 필요합니다. 그 희망하는 경험적 증거를 들어
:
>>> def swap_xy_repeatedly():
... while 1:
... swap_xy()
... if x == y:
... # If all swaps are atomic, there will never be a time when x == y.
... # (of course, this depends on "if x == y" being atomic, which it isn't;
... # but if "if x == y" isn't atomic, what hope have we for the more complex
... # "x, y = y, x"?)
... print 'non-atomic swap detected'
... break
...
>>> t1 = threading.Thread(target=swap_xy_repeatedly)
>>> t2 = threading.Thread(target=swap_xy_repeatedly)
>>> t1.start()
>>> t2.start()
>>> non-atomic swap detected
예, 가능합니다.
크레 이건 Sitaker 글 :
누군가가 스레드 안전 스왑을 얻을 수있는 관용구
spam, eggs = eggs, spam
를 사용하는 것이 좋습니다. 이게 정말 효과가 있니? (...)
따라서이 스레드가 첫 번째 LOAD_FAST
과 마지막 STORE_FAST 사이의 위치에서 제어를 잃는 경우 다른 스레드
에 의해 값이 저장되어 손실 될 수 있습니다. 이걸 지키고있는 게 없어.
그런가?아니요. 일반적으로 단순한 할당은 스레드 안전성이 필요합니다. 할당을 수행하면 객체의 특수 메소드를 호출 할 수 있습니다.이 메소드는 숫자 의 조작이 필요할 수 있습니다. 개체 은 "상태"값을 내부적으로 잠 갔기 때문에이 항상 그런 것은 아닙니다. 그것에 대해 "스레드 안전"을 이야기하기 어렵다 있도록
하지만 정말 때문에이 내 마음에, "스레드 안전"특정 응용 프로그램에서 무엇을 의미하는지에 의해 결정이야는 안전 단위의 많은 수준이다. 유일한 것에 관해서는 파이썬 인터프리터는 에 무료로 제공됩니다. 내장 된 데이터 유형은 내장 스레딩을 사용하는 경우에도 내부에서 안전해야합니다. 즉 이 경우 스레드가
a=0xff
및a=0xff00
을, A는 가 보호되지 않는 경우 다른 언어에서 가능한 수 있습니다 하나 또는 다른,하지만 실수0xffff
와 을 종료합니다. 말했다와는 파이썬은 또한 가장자리에 조금 살고 이 에 기꺼이하는 경우 , 공식 잠금없이 멀리 엄청 많이 얻을 수있는 그런 방식으로 실행 경향 실제 개체에 대한 암시 적 종속성. 여기에 해당 라인을 따라 예의 토론이있었습니다. c.l.p a while back - others 중 " 섹션 및 뮤텍스"중요 스레드에 대해 groups.google.com을 검색하십시오. 개인적으로
, 내가 명시 적으로 멀티 스레드 응용 프로그램에서 상태 (예 :
Queue.Queue
같은 교환 정보 공유 스레드 사이에 제대로 을 위해 설계 또는 사용 구조를) 공유 잠금. 내 마음에 그것은 최고의 보호 유지 보수 및 진화에 대해 도로.- - David
이유는 무엇입니까? 길? 해체는 원 자성을 제안하지 않습니다 (@ jemfinch의 대답 참조). – kennytm
(BTW, 위의 설명은 수사적 질문이 아닙니다.) – kennytm
@Kenny : 저수준에서 튜플 압축 풀기가 어떻게 작동했는지에 대한 오해였습니다. – voyager