2013-03-11 2 views
0

파이썬 사전이 있고 여러 스레드가 추가되어있는 경우 모든 스레드가 자체 키에 추가한다는 것을 알고있는 경우 요소 추가를 동기화해야합니까? (내 말은 동일한 키에 대한 추가가 동시에 발생할 수 없다는 뜻입니다).파이썬 사전에 동기화가 필요합니까?

+0

가능한 복제본 http://stackoverflow.com/questions/3358770/python-dictionary-is-thread-safe – shx2

+0

나는 그것이 중복이라고 생각하지 않습니다. – coredump

+0

당신 말이 맞아요. 하지만 그것은 http://stackoverflow.com/questions/6953351/thread-safety-in-pythons-dictionary – shx2

답변

2

키가 스레드 당 고유하지 않은 경우 사전 개체에 대한 액세스를 동기화해야 할 수도 있습니다. 액세스가 반드시 스레드로부터 안전하지는 않습니다.

언제든지 dis (disassembler) module을 사용하여 파이썬 코드를 확인할 수 있습니다. 파이썬 스레드 컨텍스트는 임의의 opcode (opcode 자체는 원자 적으로 실행 됨)간에 전환 할 수 있습니다. 사전인가에 대한 접근은 여러 옵 코드를 통해 확산 될 수 있습니다

>>> def foo(): 
...  somedict = {} 
...  somedict['bar'] = 'spam' 
... 
>>> import dis 
>>> dis.dis(foo) 
    2   0 BUILD_MAP    0 
       3 STORE_FAST    0 (somedict) 

    3   6 LOAD_CONST    1 ('spam') 
       9 LOAD_FAST    0 (somedict) 
      12 LOAD_CONST    2 ('bar') 
      15 STORE_SUBSCR   
      16 LOAD_CONST    0 (None) 
      19 RETURN_VALUE   

somedict['bar'] = spam 라인과 관련된 4 옵 코드,는 somedict 참조를 로딩 'bar''spam' 상수를로드 및 저장 작업을 호출이 있습니다. 스레드 컨텍스트는 이러한 opcode간에 전환 할 수 있습니다.

즉, 키가 스레드마다 고유 한 것이 보장되면 구조를 잠그지 않고 도망 갈 수 있습니다. 모든 opcode와 마찬가지로 STORE_SUBSCR opcode는 GIL에서 파이썬 인터프리터에 의해 실행되므로 에 저장하고 정보를 읽는 다중 스레드이 안전해야합니다.

Python 표준 라이브러리 라이브러리는 몇 가지 위치에서이 작업을 수행합니다. 사전에 스레드 별 정보를 저장하기위한 사전 키로 thread.thread_ident()을 사용합니다. 예를 들어, threading module_active 모듈 - 전역 사전을 스레드 식별자로 유지합니다.

+0

'STORE_SUBSCR' 연산 코드가 반드시 원자적일 필요는 없다. 이미 존재하는 키를 덮어 쓰고, 키나 덮어 쓰여진 값이'__del__'을 사용하거나 그럴 경우) 객체가 해제 될 때 스레드 전환을 얻을 수 있습니다. 실제로 이것은 문제가되지는 않지만 명시 적 잠금을 피하기 위해 GIL을 활용하려고 할 때 기억해야 할 가치가 있습니다. – Duncan

관련 문제