2010-09-10 11 views
7

मैं अजगर बहु ​​का इस्तेमाल किया और इस कोड के साथ सभी प्रक्रियाओं का इंतजार करते हैं:अजगर बहु ​​पूल, प्रक्रियाओं के लिए प्रतीक्षा करें और कस्टम पुनः आरंभ प्रक्रियाओं

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

मैं pool.join का उपयोग लेकिन त्रुटि प्राप्त करने की कोशिश

क्यों काम नहीं करते? और सभी प्रक्रियाओं का इंतजार करने का अच्छा तरीका क्या है।

मेरा दूसरा सवाल यह है कि मैं पूल में कुछ प्रक्रिया को पुनरारंभ कैसे कर सकता हूं? मुझे स्मृति रिसाव के कारण इसकी आवश्यकता है। अब वास्तव में सभी प्रक्रियाओं के बाद मैंने सभी पूलों का पुनर्निर्माण किया है (प्रक्रिया को पुनरारंभ करने के लिए नया ऑब्जेक्ट पूल बनाएं)।

मुझे क्या चाहिए: उदाहरण के लिए मेरे पास पूल में 4 प्रक्रिया है। फिर कार्य पूरा होने के बाद, अपना कार्य प्राप्त करें, मुझे प्रक्रिया को मारने और नई शुरू करने की आवश्यकता है (स्मृति रिसाव को ताज़ा करने के लिए)।

+1

'साइट-पैकेज' में 'मल्टीप्रोसेसिंग/पूल.py' क्यों रह रहा है और सीधे' लीब 'में क्यों नहीं है? यदि आप इस पर हैकिंग कर रहे हैं, तो हमें जानने की आवश्यकता है। – aaronasterling

+0

हम्म .. मुझे नहीं पता कि मैं इसे विंडोज इंस्टालर के साथ स्थापित करता हूं ... आधिकारिक साइट से प्राप्त .. – Evg

+0

मेरे पास python2.5 – Evg

उत्तर

17

आपको त्रुटि हो रही है क्योंकि आप pool.join()

मैं एक अच्छा तरीका है बंद करने के लिए एक प्रक्रिया apply_async के साथ शुरू की पता नहीं है कॉल करने से पहले pool.close() फोन लेकिन अगर ठीक से पूल को बंद नहीं करता है देखने की जरूरत अपनी याददाश्त रिसाव दूर जाओ।

कारण मुझे लगता है कि Pool कक्षा में गुणों का एक समूह है जो डिमन मोड में चल रहे धागे हैं। इन सभी धागे को join विधि द्वारा साफ़ किया जाता है। आपके पास अब जो कोड है, वह उन्हें साफ़ नहीं करेगा, इसलिए यदि आप एक नया Pool बनाते हैं, तो आपके पास अभी भी उन सभी धागे हैं जो अंतिम से चल रहे हैं।

+0

thnx है जो इसे बंद करता है। पूल के बारे में – Evg

+0

मेरा मतलब है कि ऐसा लगता है कि पूल उपयोग प्रक्रियाएं अंत तक शुरू होती हैं। मेरी लिपि लंबे समय तक काम में है और समय के साथ पूल की सभी प्रक्रियाएं स्मृति में बढ़ने लगती हैं, मैं समय-समय पर प्रक्रिया के स्मृति उपयोग को रीसेट करना चाहता हूं (प्रक्रिया के लिए प्रत्येक नया कार्य) और प्रक्रिया को पुनरारंभ करना एक तरीका है जिसे मैं कर सकता हूं। मुझे लगता है कि – Evg

+0

माफ करना मेरा मतलब है कि मेमोरी लीक नहीं है, मेरा मतलब प्रक्रिया की याद में सरल बढ़ रहा है और इस प्रक्रिया को पुनरारंभ करने के माध्यम से बढ़ रहा है। – Evg

संबंधित मुद्दे