Sto implementando la libreria di multiprocessing di Python utilizzando un pool di worker. Ho implementato il seguente codiceMultiprocessing di Python che porta a molti processi di zombi
import main1
t1 = time.time()
p = Pool(cores)
result = p.map(main1, client_list[client])
if result == []:
return []
p.close()
p.join()
print "Time taken in performing request:: ", time.time()-t1
return shorted(result)
Tuttavia, dopo aver eseguito il processo per un po ', ottengo molti processi in background in esecuzione della mia app. Ecco un'istantanea dopo aver fatto ps aux per la mia app
Ora, ho letto un sacco di domande simili su StackOverflow come how to kill zombie processes created by multiprocessing module? che richiede per l'utilizzo di .join(), che ho già implementato e ho imparato come uccidere tutti questi processi da qui Python Multiprocessing Kill Processes. Ma voglio sapere cosa potrebbe andare storto con il mio codice. Non potrò condividere tutto il mio codice nella funzione main1 ma ho messo l'intero blocco di codice nel try catch block per evitare casi in cui un errore nel codice principale potrebbe portare a processi di zombi.
def main1((param1, param2, param3)):
try:
resout.append(some_data) //resout in case of no error
except:
print traceback.format_exc()
resout = [] //sending empty resout in case of error
return resout
Sono ancora molto nuovo al concetto di problemi di programmazione e debugging in parallelo con essa viene svolta a essere di aiuto tricky.Any sarà molto apprezzato.
Sfortunatamente il codice che hai postato non aiuta molto nella diagnosi del problema. Troppe variabili inspiegabili e, cosa più importante, non è chiaro da ciò che hai pubblicato come viene chiamato il codice e cosa succede dopo il ritorno della funzione. La mia impressione iniziale è che si stanno creando molti pool in un ciclo, invece di riutilizzare un pool molte volte. Ma non posso davvero esserne sicuro. – justinpawela
[Dovresti strutturare il tuo codice in questo modo.] (Http://pymotw.com/2/multiprocessing/communication.html#process-pools) Se hai molto lavoro da fare, dovresti usare la stessa piscina più e più volte (Dovresti sempre chiamare 'Pool()' una volta). Quando hai finito con i processi di lavoro, chiamare 'close' e' join' è importante - sono ciò che segnala i processi da terminare; non sono solo per abortire gli zombi. Nel tuo primo blocco di codice sopra, se 'results' è vuoto, non puoi mai terminare i worker, devi solo tornare a qualunque codice fosse il chiamante. – justinpawela