2010-07-22 6 views
41

파이썬에서 멀티 스레드로 시작하고 있습니다 (또는 적어도 내 스크립트가 다중 스레드를 생성 할 수 있음). 이 알고리즘이 뮤텍스의 올바른 사용법일까요? 나는이 코드를 아직 테스트하지 않았고 아마도 작동하지 않을 것이다. 대기열에 스레드가 있어도 processData를 스레드 (한 번에 하나)에서 실행하고 기본 while 루프를 계속 실행하기 만하면됩니다.파이썬에서 뮤텍스를 올바르게 사용하기

편집 : 내 코드를 다시 읽는다. 나는 그것이 크게 틀린 것을 알 수있다. 하지만 이봐, 그게 내가 여기있는 이유 야.

+0

당신이하려고하는 것을 파악하기가 매우 어렵다 해야 할 것. 귀하의 의도를보다 자세히 설명해야합니다. –

+0

@Marcelo Cantos, 죄송합니다. 아마도 맞을 것입니다. processData의 코드를 새 트레드에서 시작하고 싶습니다. 난 단지 한 스레드가 한 번에 데이터를 처리 할 수 ​​있고 데이터를 처리하기 위해 어떤 데이터를 전송했는지를 원합니다. 다른 스레드가 대기열에있는 동안 루핑을 유지하는 기본 while 루프를 원합니다. – Richard

+0

@ 리차드 : 어쨌든 모든 처리를 직렬화하려는 경우 왜 스레드를 사용하고 싶습니까? 간단한 루프의 문제점은 무엇입니까? 또한, 왜 당신은 메인 스레드가 계속 반복 되길 원합니 까? 그것은 단지 CPU를 태우고 다른 스레드를 굶주리게 할 것입니다. –

답변

96

. 이 경우 괜찮 - 때문에 CPython과의 아키텍처 (즉 Global Interpreter Lock) 효과적으로 하나 개의 스레드 만 어쨌든 한 번에 실행해야합니다으로,

from threading import Thread, Lock 

mutex = Lock() 

def processData(data): 
    mutex.acquire() 
    try: 
     print('Do some stuff') 
    finally: 
     mutex.release() 

while True: 
    t = Thread(target = processData, args = (some_data,)) 
    t.start() 

그러나주의 : 파이썬 방법 사용이 매우 간단하다 I/O 바운드 스레드가 다른 스레드가 실행되는 것을 차단하지 않도록 잠금 장치를 최대한 많이 해제하려고 할지라도 다수의 I/O 바운드가 있습니다.

파이썬 2.6 이상에서는 파이썬의 multiprocessing 패키지를 사용합니다. threading 패키지를 반영하지만 완전히 새로운 프로세스를 만들 것입니다. 동시에 실행할 수 있습니다.

from multiprocessing import Process, Lock 

mutex = Lock() 

def processData(data): 
    with mutex: 
     print('Do some stuff') 

if __name__ == '__main__': 
    while True: 
     p = Process(target = processData, args = (some_data,)) 
     p.start() 
+0

귀하의 코드를 시도하고, 나는이 오류가 발생합니다 : 뮤텍스 : SyntaxError : 잘못된 구문. 나는 try : except를 사용할 수 있다고 생각한다. 내 함수에서 파이썬 2.4를 사용하고있다. – Richard

+4

'with'는 파이썬 2.5이고,'multiprocessing'는 파이썬 2.6이다. 그에 따라 편집 됨. –

+0

모든 도움을 주셔서 감사합니다. 만약 내가 한 번 더 당신을 업 그레 이드 할 수 있다면. 나는 그들 모두에게 도움을 주었다. – Richard

7

당신은 언젠가에서 당신의 뮤텍스 잠금을 해제해야합니다 ... 당신은 윈도우의 뮤텍스 대신 파이썬을 사용하는 이유를 모르겠어요

12

이 내가 생각 해낸 해결책은 다음과 같습니다 : 그것은 업데이트하기 위해 예를 들어 사소한

import time 
from threading import Thread 
from threading import Lock 

def myfunc(i, mutex): 
    mutex.acquire(1) 
    time.sleep(1) 
    print "Thread: %d" %i 
    mutex.release() 


mutex = Lock() 
for i in range(0,10): 
    t = Thread(target=myfunc, args=(i,mutex)) 
    t.start() 
    print "main loop %d" %i 

출력 :

main loop 0 
main loop 1 
main loop 2 
main loop 3 
main loop 4 
main loop 5 
main loop 6 
main loop 7 
main loop 8 
main loop 9 
Thread: 0 
Thread: 1 
Thread: 2 
Thread: 3 
Thread: 4 
Thread: 5 
Thread: 6 
Thread: 7 
Thread: 8 
Thread: 9 
+5

잠재적 인 교착 상태가 있습니다. print 문이 Exception을 던지면 뮤텍스를 해제하지 않습니다. 잠금을 해제하려면'try/release' 또는'with'를 사용해야합니다. 내 대답을 보라. –

+2

또한 뮤텍스를 인수로 함수에 전달할 필요가 없습니다. 글로벌 범위에서 사용할 수 있습니다. –

관련 문제