2016-01-19 31 views
5

Aşağıdaki kodu çalıştırdığımda bellek artıyordu. Ancak, time.sleep(3)'u sildiysem top numaralı telefondan 0.1 oldu ve hiçbir zaman artmadı.Python - time.sleep neden bellek sızıntısına neden oluyor?

process doğru şekilde sonlandırılmıyor gibi görünüyor, ancak neden?

Kodu (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 resmi belgede '' join() 'https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing kullanmadan önce close() veya terminate() yöntemini çağırmalıdır. Pool.join – tanglong

+2

Aşağıdaki soru sizin için ilginç olabilir: http: //stackoverflow.com/questions/7648967/python-multiprocessing-how-to-release-memory-when-a-process-is-done Cevabı kontrol edin user1914881: "Havuzda maxtasksperchild argümanını ayarlamayı deneyin. Eğer yapmazsanız, bu işlem havuz tarafından tekrar tekrar açılır ve böylece bellek asla serbest bırakılmaz. Ayarlandığında, işlemin ölmesine ve yeni onun yerine bir tane yaratılmış, bu da hafızayı etkin bir şekilde temizleyecek. ” Süreçler, hiçbir zaman 1 döngüsünde asla piyasaya sürülmeyen bir hafıza tutuyor gibi görünüyor. (Emin değilim) –

+0

@RobinSpiess 'maxtasksperchild' denedim ama – tanglong

cevap

1

Bildiğim kadarıyla, senin de aynı Havuz yeni işlemler spawn gibi gelen bellek serbest kalmaz, çöp toplama, yapmadığım olduğunu düşünüyorum Bildiğim Eski işlemleri, bunları kullanarak bitmiş olsa bile. Bir düzeltme sizin süre döngüde çöp toplama zorlamak olacaktır: Eğer süreçlerin başka bir set başlatmadan önce çöp toplama zorlamak olarak

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() 

Bu

benim için bellek sızıntıları sabit. Umarım birileri bu hafıza sızıntısını ortaya çıkarmanın nedenini daha ayrıntılı bir şekilde açıklayabilir.

+0

yardım etmedi teşekkürler, bir iyilik yapar. – tanglong

İlgili konular