2013-05-31 2 views
1
def start(self): 
    self.running = True 
    while self.running: 
     pass 

def shut_down(self): 
    self.running = False 

안녕하세요, 저는 변수 실행을 동기화하는 좋은 방법을 알고 싶습니다. 빠른 솔루션을 갖고 싶지만 더 좋은 세마포어, 뮤텍스 또는 잠금 장치가 무엇인지 알지 못했습니다. shut_down이 자주 사용되지 않는다고 가정합니다.가변 루프 및 동기화

이것은 최선의 해결책이지만 더 잘할 수 있다고 생각합니다. 부울 플래그와 같은 원시 값과의 간단한 예를 들어

def start(self): 
    self.__lock__.acquire() 
    self.running = True 
    while self.running: 
     self.__lock__.release() 
     self.__lock__.acquire() 

def shut_down(self): 
    self.__lock__.acquire() 
    self.running = False 
    self.__lock__.release() 

답변

1

, 아니 동기화는 파이썬에 필요하지 않습니다. 적어도, CPython에는 없다. (표준 인터프리터는 python.org에서 다운로드 할 수있다.)

인터프리터 전체가 "전역 인터프리터 잠금"에 포함되어 있기 때문에 파이썬 수준에서 한 번에 하나의 스레드 만 실행할 수 있습니다 (여러 스레드가 확장 모듈에서 동시에 작업 할 수 있습니다. 모듈은 적절한 시간에 GIL을 해제하도록 설정됩니다. 따라서 start 함수에서 루핑하는 작업자 스레드가 running 특성을 검사하면 해당 개체가 정상 상태임을 보증합니다. shut_down 이외의 코드로 수정하지 않으면 True 또는 False이 될 수도 있습니다.

CPython을 사용할 예정이고 매우 간단한 논리 (한 스레드 만 작성한 부울 플래그와 같은)를 고수한다면 첫 번째 예제 코드가 정상적으로 작동합니다.

여러 스레드 중 하나에 의해 증가 될 수있는 카운터처럼 더 복잡한 논리가 필요한 경우 TOCTTOU과 같은 경쟁 조건을 피하기 위해 약간의 동기화가 필요합니다.

파이썬이 제공하는 가장 쉬운 동기화 도구 중 하나는 the queue module으로, FIFO 방식으로 스레드 간의 동기화 된 통신을 허용합니다. 그 성능을 낮은 레벨의 물건과 비교할 수는 없지만 큐를 올바르게 작동시키는 코드를 얻는 것은 쉽습니다 (수동 잠금을 엉망으로 만들거나 디버그의 악몽 인 교착 상태 또는 경쟁 조건으로 끝내는 반면에) .

+0

여러 개의 클라이언트로 나만의 미니 서버를 작성하고 싶습니다. 다중 처리 또는 스레딩 마녀가 더 좋을까요? – Luffy

+0

@Luffy 정확히 무엇을 기다리고 있는지에 달려 있습니다. 서버가 CPU 집약적 인 작업을 실행하고 있다면 다중 처리를 원할 것입니다. 다중 처리는 파이썬이 동시에 여러 CPU/코어를 사용할 수있게하기 때문입니다. 반면에 서버가 직면하게 될 대부분의 지연이 I/O 관련 (디스크에서 파일 읽기, 네트워크를 통해 물건 보내기/받기) 인 경우 멀티 스레딩으로 충분할 수 있습니다. 필자는 멀티 스레딩이 오버 헤드와 동기화 비용이 적다는 것을 의심하지만 확실하지 않은 경우 다양한 솔루션을 테스트합니다. – Blckknght

+0

자문을 구하십시오. 먼저 스레드로 시도 할 것입니다. – Luffy