이 다중 처리 코드는 예상대로 작동합니다. 이 프로그램은 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의 다중 처리 문서에서 잠금이 인수로 전달됨). 아래 코드는 위의 코드에서 인수로 전달하는 것과는 반대로 전역 적으로 선언 된 잠금을가집니다.
고마워요! apply_async와 반대로 apply를 사용하는 것은 이러한 문제를 디버깅하는 유용한 방법 인 것 같습니다. –
그래,'apply_async'는 경고 메시지를 출력하지 않는다는 것은 다소 어리 석다. – matsjoyce
동의하지만, 해결 방법으로는 Python 3에서 apply_async의 error_callback을 사용할 수 있습니다. 파이썬 2에 대한 임시 해결책 -> http://stackoverflow.com/questions/27986885/error-callback-in-multiprocessing-pool-apply-async-in-python-2 – TitanFighter