2011-10-04 6 views
20

Ho riscontrato un problema strano durante l'utilizzo della libreria di multiprocessing python.Multiprocessing di Python - Come rilasciare memoria quando un processo è terminato?

Il mio codice è schematizzato di seguito: creo un processo per ogni tupla "simbolo, data". Unisco i risultati in seguito.

Mi aspetto che quando un processo ha eseguito il calcolo per una tupla "simbolo, data", dovrebbe rilasciare la sua memoria? a quanto pare non è questo il caso. Vedo dozzine di processi (anche se ho impostato il pool di processi con la dimensione 7) che sono sospesi¹ nella macchina. Non consumano CPU e non rilasciano la memoria.

Come faccio a lasciare che un processo rilasci la sua memoria, dopo aver eseguito il calcolo?

Grazie!

¹ da intendo il suo stato in comando ps è indicata come "S +" "sospeso"

def do_one_symbol(symbol, all_date_strings): 
    pool = Pool(processes=7) 
    results = []; 
    for date in all_date_strings: 
     res = pool.apply_async(work, [symbol, date]) 
     results.append(res); 

    gg = mm = ss = 0; 
    for res in results: 
     g, m, s = res.get() 
     gg += g; 
     mm += m; 
     ss += s; 

risposta

22

Forse si tenta di chiudere pool utilizzando pool.close e quindi attendere per il processo alla fine da pool.join, perché se processo padre continua a correre e non aspetta che i processi figli diventeranno zombies

+0

questa è stata la causa principale del mio script causato nodo riavvio a causa di> 90% di memoria da 4 GB sono stati consumati :) Grazie! –

11

provare a impostare la argomento maxtasksperchild sul pool. In caso contrario, il processo viene riutilizzato più e più volte dal pool in modo che la memoria non venga mai rilasciata. Quando impostato, il processo sarà autorizzato a morire e ne verrà creato uno nuovo al suo posto. Questo pulirà efficacemente la memoria.

Credo che c'è di nuovo in 2,7: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

+0

Ho usato questo approccio, funziona bene. La domanda è, perché non rilascia la memoria? O forse non abbastanza veloce ... ?? – Elvin