2016-01-19 20 views
5

Kiedy uruchomiłem poniższy kod, pamięć wzrastała. Jednak jeśli usunąłem time.sleep(3), był to 0.1 w top i nigdy nie został zwiększony.Python - dlaczego funkcja time.sleep powoduje przeciek pamięci?

Wygląda na to, że process nie został poprawnie zakończony, ale dlaczego?

Code (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 oficjalny dokument powiedział: "Trzeba wywołać close() lub zakończyć() przed użyciem join()' https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing. Pool.join – tanglong

+2

Następujące pytanie może być interesujące dla Ciebie: http: //stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done Sprawdź odpowiedź user1914881: "Spróbuj ustawić argument maxtasksperchild na puli .Jeśli nie, proces jest powtarzany wielokrotnie przez pulę, więc pamięć nigdy nie jest zwolniona. Po ustawieniu proces będzie mógł umrzeć, a nowy jeden stworzony w swoim miejscu, który skutecznie oczyści pamięć. " Procesy wydają się zawierać trochę pamięci, która nigdy nie jest wypuszczana w pętli 1 while. (Chociaż nie jestem pewien) –

+0

@RobinSpiess Próbowałem 'maxtasksperchild', ale nie pomogło – tanglong

Odpowiedz

1

O ile wiem, myślę, że jak tarło nowych procesów w tej samej puli, zbieranie śmieci nigdy nie jest zrobione, więc nie zwalnia z pamięci stare procesy, nawet jeśli ich używasz. Jedna poprawka będzie egzekwować zbieranie śmieci w pętli 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() 

To stałe przecieki pamięci dla mnie, jak zmusić zbieranie śmieci przed rozpoczęciem kolejnego zestawu procesów. Mam nadzieję, że ktoś mógłby wyjaśnić w sposób bardziej szczegółowy powód, dla którego ta pamięć przecieka.

+0

Dzięki, robi przysługę. – tanglong

Powiązane problemy