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()
@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
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) –
@RobinSpiess Próbowałem 'maxtasksperchild', ale nie pomogło – tanglong