2011-10-04 27 views
20

Python çoklu işlem kitaplığını kullanırken garip bir sorunla karşılaştım.Python çoklu işlem - Bir işlem yapıldığında bellek nasıl bırakılır?

Kodum aşağıda çizilmiştir: Her "sembol, tarih" için bir işlem oluşturuyorum. Sonrasında sonuçları birleştiririm.

Bir işlemin bir "sembol, tarih" tuple için hesaplama yapması durumunda, belleğini bırakması beklenir. görünüşe göre bu durum böyle değil. Makinede askıya alınmış düzinelerce süreç (süreç havuzunu 7 bedene sahip olmamasına rağmen) görüyorum. CPU kullanmazlar ve hafızayı serbest bırakmazlar.

Bir işlemin hesaplamasını yaptıktan sonra belleğin nasıl serbest bırakılmasına nasıl izin veririm?

Teşekkürler! "Askıya" Ben ps komutu statüleri olarak gösterilen demek "S +"

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; 

cevap

22

Üst işlemi çalıştıran tutar ve bunlar zombies

+0

Bu Senaryomun kök neden dolayı 4Gb bellek% 90 tüketilmiştir> için düğüm yeniden başlatma neden oldu :) Teşekkürler! –

11

belirlemeyi deneyin olacak çocuk süreçler için beklemez çünkü eğer, pool.close kullanarak havuza kapatıp pool.join bitirmek işlemi için beklemek deneyin mü Havuzda maxtasksperchild argüman. Eğer yapmazsanız, işlem havuz tarafından tekrar tekrar başlatılır ve böylece bellek hiçbir zaman serbest bırakılmaz. Ayarlandığında, işlemin ölmesine ve yerine yeni bir tane oluşturulmasına izin verilecektir. Bu, hafızayı etkili bir şekilde temizleyecektir.

Ben 2.7'de yeni sanırım: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

+0

Bu yaklaşımı kullanıyorum, iyi çalışıyor. Soru şu ki, neden belleği bırakmıyor? Ya da belki yeterince hızlı değil ... ?? – Elvin

İlgili konular