2010-09-10 19 views
7
Python çoklu işlem kullanılır ve bu kodla tüm işlemlerin bekleme yapmak

:piton çoklu işlem havuzu, süreçler bekleyin ve özel yeniden işler

Traceback (most recent call last): 
    File "C:\workspace\sdl\lxchg\walker4.py", line 163, in <module> 
    pool.join() 
    File "C:\Python25\Lib\site-packages\multiprocessing\pool.py", line 338, in joi 
n 
    assert self._state in (CLOSE, TERMINATE) 
AssertionError 
:

... 
      results = [] 
      for i in range(num_extract): 
       url = queue.get(timeout=5) 
       try: 
        print "START PROCESS!" 
        result = pool.apply_async(process, [host,url],callback=callback) 
        results.append(result) 
       except Exception,e: 

        continue 


      for r in results: 
       r.get(timeout=7) 
... 

i pool.join kullanmak ancak hatayı elde etmeye çalışmak

işe Neden yok katılmak? Ve tüm süreçleri beklemenin iyi yolu nedir?

İkinci sorum ben havuzda belirli işlemini yeniden başlatabilirsiniz nasıl? Bellek sızıntısı nedeniyle buna ihtiyacım var. Şimdi tüm süreçleri tamamladıktan sonra tüm havuzu yeniden yapıyorum (yeni nesneyi yeniden oluşturmak için nesne havuzu oluştur).

i gerekenler: örneğin i havuzda 4 süreç var. Sonra görevini yap, görev tamamlandıktan sonra süreci öldürmem ve yeni başla (bellek sızıntısını yenilemek için).

+1

neden 'çoklu işlem/pool.py'' site packages' yaşam olup Lib' 'doğrudan mı? Eğer onu hacklediysen, bilmemiz gerekiyor. – aaronasterling

+0

hmm .. ben çalıştığını yakın olan python2.5 – Evg

+0

bilmiyorum. – Evg

cevap

17

düzgün havuz kapatma yapmazsa ben bir süreçtir apply_async ile başladı kapatmaya iyi bir yol bilmiyorum pool.join()

çağırmadan önce pool.close() diyoruz ama görmek gerek çünkü hatayı alıyorsanız bellek sızıntısı git git.

Bu Pool sınıf cin modunda çalışan iş parçacığı olan niteliklerin bir demet sahip olduğunu düşünüyorum sebep. Bu konuların tümü join yöntemiyle temizleniyor. Artık sahip olduğunuz kod onları temizlemeyecek, böylece yeni bir Pool oluşturursanız, yine de sonuncudan çalışan tüm konulara sahip olacaksınız.

+0

thnx var .. resmi sitesinden eğitim çalışma- larından hedef ... ben windows yükleyicisi ile yüklemek – Evg

+0

havuzu hakkında, havuz kullanım süreçlerinin baştan sona yarattığı anlaşılıyor. Komutumun uzun çalışma zamanı ve zamanla tüm havuz süreçleri hafızada büyümeye başlıyor, zaman zaman sürecin bellek kullanımını sıfırlamak (süreç için her yeni görev) ve sürecin yeniden başlatılması bunu yapabileceğim bir yoldur. Ben – Evg

+0

düşünüyorum üzgünüm bellek sızıntısı demek değil, basit bir süreç hafızasında büyümeyi kastediyorum ve sürecin yeniden başlatılmasıyla bu büyümeyi kontrol ediyorum. – Evg

İlgili konular