2015-05-28 16 views
6

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

Snapshot showing all the zombie processes

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.

+0

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

+0

[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

risposta

10

In genere il problema più comune è che il pool viene creato ma non chiuso.

Il modo migliore che conosco per garantire che la piscina è chiusa è quello di utilizzare un try/finally clausola:

try: 
    pool = Pool(ncores) 
    pool.map(yourfunction, arguments) 
finally: 
    pool.close() 
    pool.join() 

Se non si vuole lottare con multiprocessing, ho scritto un pacchetto semplice di nome parmap che avvolge il multiprocessing per rendere più facile la mia vita (e potenzialmente la tua).

pip install parmap

import parmap 
parmap.map(yourfunction, arguments) 

Dalla sezione utilizzo parmap:

  • semplice esempio parallelo:

    import parmap 
    y1 = [myfunction(x, argument1, argument2) for x in mylist] 
    y2 = parmap.map(myfunction, mylist, argument1, argument2) 
    y1 == y2 
    
  • l'iterazione di una lista di tuple:

    # You want to do: 
    z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist] 
    z = parmap.starmap(myfunction, mylist, argument1, argument2) 
    
    
    # You want to do: 
    listx = [1, 2, 3, 4, 5, 6] 
    listy = [2, 3, 4, 5, 6, 7] 
    param = 3.14 
    param2 = 42 
    listz = [] 
    for (x, y) in zip(listx, listy): 
        listz.append(myfunction(x, y, param1, param2)) 
    # In parallel: 
    listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2) 
    
+0

Questo è davvero così conveniente per gli sviluppatori che non vogliono gestire il disordine associato alla multielaborazione. – ankits

Problemi correlati