2012-03-28 7 views
2

파이썬의 기본 세트 타입은 일반적으로 쓰레드 세이프는 아니지만 this 답변은 두 개의 경쟁 쓰레드에서 pop()을 호출하는 것이 안전하다는 답변을 알고 있습니다. 물론 예외가 발생할 수 있지만 데이터가 손상되지는 않습니다. 이 주장을 입증하는 문서를 찾지 못하는 것 같습니다. 사실입니까? 문서, 제발!파이썬에서 set.pop()는 threadsafe입니까?

+0

파이썬 소스 코드를 살펴보면,'set' 객체는 몇 가지 편리한 방법으로 된 사전입니다. – Blender

+0

나는 [당신이 찾고있는 대답] (http://stackoverflow.com/a/2227210/1132524)이 당신이 지적한 것의 아래에 있다고 생각합니다. 댓글을 읽고 [GIL] (http://wiki.python.org/moin/GlobalInterpreterLock)이 무엇인지 확인하십시오. –

+0

당신이 링크하는 동일한 질문은 mutable 타입은 thread-safe가 아니라고 말합니다 : http://stackoverflow.com/a/2227220/104847 당신은 경합 조건이 없도록 잠금 메커니즘을 구현해야합니다. – Ale

답변

8

set.pop method in the CPython source을 보면 GIL이 해제되지 않는다는 것을 알 수 있습니다.

즉, CPython 프로세스 내에서 한번에 하나만 set.pop이 발생합니다.

set.pop checks if the set is empty부터 빈 세트에서 팝업을 시도하여 IndexError 이외의 것을 발생시킬 수 없습니다.

그래서 아니요, CPython을 사용하여 여러 스레드에서 세트를 가져 와서 데이터를 손상시킬 수 없습니다.

+0

직접적인 문제를 해결하기 때문에이 대답을 수락하십시오. fffuuuutttuuurree에서 독자들에게주는주의 사항 : @Niklas (위)의 코멘트를 주목하십시오. –

0

두 개의 스레드가 같은 값을 낼 수 없다는 의미에서 원자 적으로 인해 "팝"연산이 스레드로부터 안전하다고 믿습니다.

예를 들어 다른 스레드가 해당 컬렉션을 반복하는 경우 해당 동작에 의존하지 않습니다.

구체적인 지침을 찾을 수 없으며이 방향을 가리키는 몇 가지 항목 만 있습니다. 파이썬 공식 문서는 이런 종류의 정보에 실제로 도움이 될 것입니다.

+0

내 대답에있는 소스 링크를 확인하십시오. CPython에서'set.next'와'set.pop'는 동시에 일어나지 않을 수 있습니다. 그래서 일어날 수있는 최악의 상황은'it 'loop - 항목을 건너 뜁니다. – agf