2017-09-05 24 views
5

ThreadPool और Poolmultiprocessing मॉड्यूल में अंतर क्या है।पाइथन मल्टीप्रोसेसिंग मॉड्यूल में थ्रेडपूल बनाम पूल के बीच क्या अंतर है

from multiprocessing import Pool 
import os, time 

print("hi outside of main()") 

def hello(x): 
    print("inside hello()") 
    print("Proccess id: ", os.getpid()) 
    time.sleep(3) 
    return x*x 

if __name__ == "__main__": 
    p = Pool(5) 
    pool_output = p.map(hello, range(3)) 

    print(pool_output) 

मैं निम्नलिखित उत्पादन देखें::

hi outside of main() 
hi outside of main() 
hi outside of main() 
hi outside of main() 
hi outside of main() 
hi outside of main() 
inside hello() 
Proccess id: 13268 
inside hello() 
Proccess id: 11104 
inside hello() 
Proccess id: 13064 
[0, 1, 4] 

"ThreadPool" के साथ:

from multiprocessing.pool import ThreadPool 
import os, time 

print("hi outside of main()") 

def hello(x): 
    print("inside hello()") 
    print("Proccess id: ", os.getpid()) 
    time.sleep(3) 
    return x*x 

if __name__ == "__main__": 
    p = ThreadPool(5) 
    pool_output = p.map(hello, range(3)) 

    print(pool_output) 

मैं देख रहा हूँ जब मैं अपने कोड की कोशिश, इस मैं देख रहा हूँ मुख्य अंतर यह है निम्नलिखित आउटपुट:

hi outside of main() 
inside hello() 
inside hello() 
Proccess id: 15204 
Proccess id: 15204 
inside hello() 
Proccess id: 15204 
[0, 1, 4] 

मेरी ques माहौल हैं:

  • क्यों "बाहर __main __()" Pool में हर बार चलाया जाता है?

  • multiprocessing.pool.ThreadPool नई प्रक्रियाओं को जन्म नहीं देता है? यह सिर्फ नए सूत्र बनाता है?

  • यदि ऐसा है तो क्या multiprocessing.pool.ThreadPool का उपयोग कर बस threading मॉड्यूल के लिए विरोध के रूप में क्या अंतर है?

मैं नहीं कहीं भी ThreadPool के लिए किसी भी आधिकारिक दस्तावेज देख पा रहे हैं, किसी को मेरी मदद कर सकते बाहर जहाँ मैं इसे पा सकते हैं?

+0

जैसा कि मुझे पता है, पाइथन में जीआईएल की वजह से, पाइथन की बहुप्रवाह बहु-धागे की तरह दिखती है लेकिन यह वास्तविक नहीं है। यदि आप पाइथन के साथ अपने बहु-कोर का लाभ उठाना चाहते हैं, तो आपको बहु-प्रोसेसिंग का उपयोग करने की आवश्यकता है। आधुनिक कंप्यूटर में, एक प्रक्रिया बनाने और धागे बनाने के लगभग एक ही लागत है। – Yves

+0

किसी थ्रेड को बनाने के लिए एक प्रक्रिया बनाने के लिए समान लागत हो सकती है, लेकिन थ्रेड्स के बीच संचार करने से प्रक्रियाओं के बीच संचार करने के लिए बहुत अलग लागत होती है (जब तक कि आप साझा स्मृति का उपयोग नहीं करते)। इसके अलावा, जीआईएल के बारे में आपकी टिप्पणी केवल आंशिक रूप से सच है: इसे आई/ओ संचालन के दौरान जारी किया जाता है और सीपीयू-बाध्य संचालन के दौरान भी कुछ पुस्तकालयों (उदा। Numpy) द्वारा जारी किया जाता है। फिर भी, जीआईएल अंततः पायथन में अलग प्रक्रियाओं का उपयोग करने का कारण है। –

उत्तर

5

multiprocessing.pool.ThreadPoolmultiprocessing.Pool जैसा ही व्यवहार करता है जो श्रमिक तर्क चलाने के लिए प्रक्रियाओं के बजाय धागे का उपयोग करता है।

कारण आप

hi outside of main() 

देख multiprocessing.Pool एक से अधिक बार मुद्रित किया जा रहा तथ्य के कारण है कि पूल होगा spawn 5 स्वतंत्र प्रक्रियाओं। प्रत्येक प्रक्रिया जो अपनी ही अजगर दुभाषिया प्रारंभ और मॉड्यूल शीर्ष स्तर print में जिसके परिणामस्वरूप लोड होगा फिर से क्रियान्वित किया जा रहा।

ध्यान दें कि यह तब होता है जब spawn प्रक्रिया निर्माण विधि का उपयोग किया जाता है (केवल विंडोज़ पर उपलब्ध विधि)। आप fork एक (यूनिक्स) का उपयोग करते हैं, तो आप संदेश धागे के लिए के रूप में केवल एक बार मुद्रित देखेंगे।

multiprocessing.pool.ThreadPool दस्तावेज़ीकरण नहीं किया गया है क्योंकि इसका कार्यान्वयन कभी पूरा नहीं हुआ है। यह परीक्षण और प्रलेखन का अभाव है। आप source code में इसके कार्यान्वयन देख सकते हैं।

मेरा मानना ​​है कि अगला प्राकृतिक प्रश्न यह है कि: थ्रेड आधारित पूल का उपयोग कब करें और प्रक्रिया के आधार पर कब उपयोग करें?

अंगूठे का नियम है:

  • आईओ बाध्य नौकरियों ->multiprocessing.pool.ThreadPool
  • सीपीयू बाध्य नौकरियों ->multiprocessing.Pool
  • हाइब्रिड नौकरियों -> काम का बोझ पर निर्भर करता है, मैं आमतौर पर multiprocessing.Pool वजह से पसंद करते हैं लाभ प्रक्रिया अलगाव

पायथन 3 पर आप concurrent.future.Executor पूल कार्यान्वयन पर एक नज़र डालना चाहते हैं ।

+0

उत्तर के लिए धन्यवाद। मैं तो बस इस बयान को समझना चाहते हैं: ध्यान दें कि यदि ऐसा होता है, तो केवल अंडे प्रक्रिया निर्माण विधि (केवल Windows पर उपलब्ध विधि) किया जाता है। आप कांटा एक (यूनिक्स) का उपयोग करते हैं, तो आप संदेश धागे के लिए के रूप में केवल एक बार मुद्रित देखेंगे। मुझे लगता है कि, "स्पॉन" और "कांटा" निहित हैं जब मैं "नक्शा()" या "पूल()" कहता हूं? या यह कुछ है जिसे मैं नियंत्रित कर सकता हूं? – ozn

+0

स्पष्टीकरण लिंक मैं जब उल्लेख [अंडे] ऊपर आप दे दी है (https://docs.python.org/3.6/library/multiprocessing.html#contexts-and-start-methods) विधि शुरू करते हैं। आप इसे नियंत्रित कर सकते हैं, लेकिन स्टार्ट विधियों की उपलब्धता ओएस प्लेटफ़ॉर्म पर निर्भर करती है। मुझे लगता है कि आप विंडोज का उपयोग कर रहे हैं क्योंकि डिफ़ॉल्ट स्टार्ट रणनीति 'स्पॉन' है। यदि ऐसा है, तो ऐसा करने के लिए बहुत कुछ नहीं है क्योंकि विंडोज़ केवल 'स्पॉन' का समर्थन करता है। – noxdafox

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