Questo codice di multiprocessing funziona come previsto. Crea 4 processi Python e li utilizza per stampare i numeri da 0 a 39, con un ritardo dopo ogni stampa.Locks multiprocessing 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()
Tuttavia, quando cerco di usare un multiprocessing.Lock per evitare che più processi da stampare sullo standard output, il programma appena esce immediatamente senza alcun output.
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()
Perché l'introduzione di un multiprocessing.Lock rende questo codice non funzionante?
Aggiornamento: Funziona quando il blocco è dichiarato globalmente (dove ho fatto alcuni test non definitivi per verificare che il blocco funzioni), in contrapposizione al codice sopra il quale passa il blocco come argomento (la documentazione di multiprocessing di Python mostra serrature passate come argomenti). Il codice seguente ha un blocco dichiarato globalmente, anziché passare come argomento nel codice sopra.
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()
Grazie! L'utilizzo dell'applicazione anziché di apply_async sembra un modo utile per eseguire il debug di questi problemi. –
Sì, sembra un po 'sciocco che 'apply_async' non stampi nemmeno un messaggio di avviso. – matsjoyce
Accetto, ma come soluzione alternativa è possibile utilizzare in Python 3 error_callback di apply_async. Soluzione alternativa per Python 2 -> http://stackoverflow.com/questions/27986885/error-callback-in-multiprocessing-pool-apply-async-in-python-2 – TitanFighter