2015-02-01 9 views
7

이 다중 처리 코드는 예상대로 작동합니다. 이 프로그램은 4 개의 파이썬 프로세스를 생성하고 각 인쇄 후에 지연을 사용하여 0에서 39까지의 숫자를 인쇄합니다. 그러나파이썬 다중 처리 잠금

import multiprocessing 
import time 

def job(num): 
    print num 
    time.sleep(1) 

pool = multiprocessing.Pool(4) 

lst = range(40) 
for i in lst: 
    pool.apply_async(job, [i]) 

pool.close() 
pool.join() 

, 내가 표준 출력에 인쇄에서 여러 프로세스를 방지하기 위해 multiprocessing.Lock를 사용하려고,이 프로그램은 모든 출력하지 않고 즉시 종료됩니다.

import multiprocessing 
import time 

def job(lock, num): 
    lock.acquire() 
    print num 
    lock.release() 
    time.sleep(1) 

pool = multiprocessing.Pool(4) 
l = multiprocessing.Lock() 

lst = range(40) 
for i in lst: 
    pool.apply_async(job, [l, i]) 

pool.close() 
pool.join() 

왜 다중 처리 .Lock이 도입되면이 코드가 작동하지 않습니까?

업데이트 : 잠금을 인수로 전달하는 코드와 달리 전역 적으로 잠금이 선언 된 경우 (잠금이 작동하는지 확인하기 위해 몇 가지 최종 테스트를 수행 한 경우) 작동합니다 (Python의 다중 처리 문서에서 잠금이 인수로 전달됨). 아래 코드는 위의 코드에서 인수로 전달하는 것과는 반대로 전역 적으로 선언 된 잠금을가집니다.

답변

6

>>> import multiprocessing 
>>> import pickle 
>>> lock = multiprocessing.Lock() 
>>> lp = pickle.dumps(lock) 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    lp = pickle.dumps(lock) 
... 
RuntimeError: Lock objects should only be shared between processes through inheritance 
>>> 

는 "Picklability"및 "피클보다 상속 나은/unpickle"섹션 :

Traceback (most recent call last): 
    File "p.py", line 15, in <module> 
    pool.apply(job, [l, i]) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 244, in apply 
    return self.apply_async(func, args, kwds).get() 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get 
    raise self._value 
RuntimeError: Lock objects should only be shared between processes through inheritance 

pool.apply_async은 그냥 숨기고 있습니다. 나는 이것을 말하기는 싫지만, 전역 변수를 사용하는 것이 아마도 가장 간단한 방법 일 것입니다. velociraptors이 도움이되지 않기를 바랍니다.

+0

고마워요! apply_async와 반대로 apply를 사용하는 것은 이러한 문제를 디버깅하는 유용한 방법 인 것 같습니다. –

+0

그래,'apply_async'는 경고 메시지를 출력하지 않는다는 것은 다소 어리 석다. – matsjoyce

+0

동의하지만, 해결 방법으로는 Python 3에서 apply_async의 error_callback을 사용할 수 있습니다. 파이썬 2에 대한 임시 해결책 -> http://stackoverflow.com/questions/27986885/error-callback-in-multiprocessing-pool-apply-async-in-python-2 – TitanFighter