Ten kod wieloprocesowy działa zgodnie z oczekiwaniami. Tworzy 4 procesy Pythona i używa ich do drukowania liczb od 0 do 39, z opóźnieniem po każdym wydruku.Blokady wieloprocesorowe Python
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()
Jednak gdy próbuję użyć multiprocessing.Lock aby zapobiec wielu procesów od drukowania na standardowe wyjście, program po prostu wychodzi natychmiast bez wyjścia.
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()
Dlaczego wprowadzenie wieloprocesowości. Blokada powoduje, że ten kod nie działa?
Aktualizacja: Działa, gdy blokada jest zadeklarowana globalnie (gdzie wykonałem kilka nieokreślonych testów, aby sprawdzić, czy blokada działa), w przeciwieństwie do kodu powyżej, który przekazuje blokadę jako argument (dokumentacja wieloprocesowa Pythona pokazuje blokady przekazywane jako argumenty). Poniższy kod ma zadeklarowaną globalnie blokadę, w przeciwieństwie do podania jako argument w powyższym kodzie.
import multiprocessing
import time
l = multiprocessing.Lock()
def job(num):
l.acquire()
print num
l.release()
time.sleep(1)
pool = multiprocessing.Pool(4)
lst = range(40)
for i in lst:
pool.apply_async(job, [i])
pool.close()
pool.join()
Dzięki! Używanie polecenia apply w przeciwieństwie do apply_async wydaje się przydatnym sposobem debugowania tych problemów. –
Tak, wydaje się nieco głupie, że 'apply_async' nawet nie wyświetla ostrzeżenia. – matsjoyce
Zgadzam się, ale jako obejście można użyć w Pythonie 3 error_callback z apply_async. Obejście dla Python 2 -> http://stackoverflow.com/questions/27986885/error-callback-in-multiprocessing-pool-apply-async-in-python-2 – TitanFighter