2016-01-19 16 views
5

Quando ho eseguito il codice di seguito, la memoria era in aumento. Tuttavia se ho cancellato time.sleep(3), era 0.1 in top e mai aumentato.Python - perché time.sleep causa perdita di memoria?

Sembra che process non venga terminato correttamente, ma perché?

Codice (Python 2.7.11):

import time 
import multiprocessing 

def process(): 
    #: FIXME 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 
+0

@vks il documento ufficiale ha detto 'È necessario chiamare close() o terminate() prima di utilizzare join()' https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing. Pool.join – tanglong

+2

La seguente domanda potrebbe essere interessante per te: http: //stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done Controlla la risposta di user1914881: "Prova a impostare l'argomento maxtasksperchild sul pool, altrimenti 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 un nuovo uno creato al suo posto, che ripulirà efficacemente la memoria. " I processi sembrano contenere un po 'di memoria che non viene mai rilasciata nel tuo ciclo while. (Anche se non ne sono sicuro) –

+0

@RobinSpiess Ho provato 'maxtasksperchild', ma non ha aiutato – tanglong

risposta

1

Per quanto ne so, penso che, come si depongono le uova nuovi processi nello stesso pool, la raccolta dei rifiuti non viene mai fatto, quindi non si rilascia la memoria da vecchi processi, anche se hai finito di usarli. Una soluzione potrebbe essere quella di far rispettare la raccolta dei rifiuti nel ciclo while:

import time 
import multiprocessing 
import gc 

def process(): 
    time.sleep(3) 
    return 

def main(): 
    pool = multiprocessing.Pool(processes=10) 
    while 1: 
     pool.apply_async(process) 
     gc.collect() 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    main() 

Questo ha fissato i perdite di memoria per me, come si forza la raccolta dei rifiuti prima di lanciare un'altra serie di processi. Spero che qualcuno possa spiegare in modo più dettagliato il motivo di questa perdita di memoria.

+0

Grazie, fa un favore. – tanglong