2016-07-08 6 views
15

मैं कर रहा हूँहमें multiprocessing.Pool.join को कब कॉल करना चाहिए?

from multiprocessing import Pool 
pool = Pool() 
for mapped_result in pool.imap_unordered(mapping_func, args_iter): 
    do some additional processing on mapped_result 

निम्नलिखित के रूप में 'multiprocess.Pool.imap_unordered' का उपयोग कर रहा pool.close या pool.join पाश के लिए के बाद कॉल करने के लिए की जरूरत है?

+0

मैं आम तौर पर पूल पूल के सभी पूल धागे शुरू करने के बाद 'pool.join() 'फिर' pool.close()' कहता हूं, लेकिन मैंने 'pool.imap_unordered()' को एक पुनरावृत्त के रूप में उपयोग करने का प्रयास नहीं किया है। – Bamcclur

+0

कॉल करने या बंद करने का क्या मतलब है? मैंने उन्हें फोन नहीं किया और मेरा कोड ठीक काम कर रहा है। हालांकि, मुझे चिंता है कि उनको बुलाए जाने के परिणामस्वरूप ज़ोंबी प्रक्रिया या अन्य सूक्ष्म चीजें नहीं होंगी। –

उत्तर

26

नहीं, आप नहीं करते हैं, लेकिन शायद यह एक अच्छा विचार है यदि आप पूल का उपयोग नहीं करेंगे। pool.close या pool.join फोन करने के लिए

कारण अच्छी तरह से this SO post में टिम पीटर्स द्वारा कहा जाता है:

Pool.close() के रूप में, आप कॉल करना चाहिए कि जब - और केवल जब - आप कभी नहीं प्रस्तुत करने के लिए जा रहे हैं पूल उदाहरण के लिए और अधिक काम करते हैं। तो Pool.close() को आम तौर पर तब कहा जाता है जब आपके मुख्य कार्यक्रम का समांतर हिस्सा समाप्त हो जाता है। तब कार्यकर्ता प्रक्रिया समाप्त हो जाएगी जब पहले से ही सौंपा गया सभी कार्य पूरा हो गया है।

कार्यकर्ता प्रक्रियाओं को समाप्त करने की प्रतीक्षा करने के लिए Pool.join() को कॉल करना भी उत्कृष्ट अभ्यास है। अन्य कारणों में, समानांतर कोड में अपवादों की रिपोर्ट करने के लिए अक्सर कोई अच्छा तरीका नहीं होता है (अपवाद केवल एक संदर्भ में होते हैं जो आपके मुख्य कार्यक्रम के बारे में अस्पष्ट रूप से संबंधित होते हैं), और Pool.join() एक सिंक्रनाइज़ेशन पॉइंट प्रदान करता है जो कुछ अपवादों की रिपोर्ट कर सकता है कार्यकर्ता प्रक्रियाओं में जो आप अन्यथा कभी नहीं देख पाएंगे।

+3

दूसरे से पहले कॉल करना बेहतर है? – RSHAP

+2

ऐसा लगता है कि लोग 'pool.close()' पहले और 'pool.join()' second को कॉल करना पसंद करते हैं। यह आपको 'pool.close()' और 'pool.join() 'के बीच काम जोड़ने की अनुमति देता है, जिसे पूल को निष्पादित करने के लिए प्रतीक्षा करने की आवश्यकता नहीं है। – Bamcclur

+0

बस @ बक्कलुर की टिप्पणी में जोड़ने के लिए - 'pool.close()' पहले कॉल करना एक अच्छा विचार नहीं है, यह वास्तव में अनिवार्य है। [डॉक्स] से [https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool): किसी को 'बंद() 'या' टर्मिनेट() 'को' में शामिल होने के() '। – Bogd

3

मैं Memory usage keep growing with Python's multiprocessing.pool रूप में एक ही स्मृति मुद्दा था जब pool.map() एक समारोह है कि Levenshtein दूरी की गणना के साथ का उपयोग कर जब मैं pool.close() और pool.join() का उपयोग नहीं किया। समारोह ठीक काम करता था, लेकिन Win7 64 मशीन पर कचरा ठीक से एकत्र नहीं किया गया था, और जब तक पूरे ऑपरेटिंग सिस्टम को नीचे नहीं ले जाता तब तक मेमोरी उपयोग नियंत्रण से बाहर बढ़ रहा था। यहां कोड है जो लीक तय करता है:

stringList = [] 
for possible_string in stringArray: 
    stringList.append((searchString,possible_string)) 

pool = Pool(5) 
results = pool.map(myLevenshteinFunction, stringList) 
pool.close() 
pool.join() 

पूल बंद करने और जुड़ने के बाद मेमोरी लीक चली गई।

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