पायथन 3.7 प्रलेखन
मैं पायथन threading
प्रलेखन से निम्नलिखित उद्धरण को भी उजागर करना चाहूंगा :
CPython कार्यान्वयन विवरण: CPython में, ग्लोबल इंटरप्रेटर लॉक के कारण, केवल एक धागा पायथन कोड को एक ही बार में निष्पादित कर सकता है (भले ही कुछ प्रदर्शन उन्मुख पुस्तकालय इस सीमा को पार कर सकते हैं)। यदि आप चाहते हैं कि आपका एप्लिकेशन मल्टी-कोर मशीनों के कम्प्यूटेशनल संसाधनों का बेहतर उपयोग करे, तो आपको सलाह दी जाती है कि आप इसका उपयोग करें multiprocessing
या concurrent.futures.ProcessPoolExecutor
। हालाँकि, थ्रेडिंग अभी भी एक उपयुक्त मॉडल है यदि आप एक साथ कई I / O- बाउंड कार्य चलाना चाहते हैं।
यह ग्लोसरी प्रविष्टि के लिएglobal interpreter lock
लिंक है जिसके बारे में बताते हैं कि GIL का अर्थ है कि Python में थ्रेडेड समानताएँ CPU बाध्य कार्यों के लिए अनुपयुक्त है :
CPython दुभाषिया द्वारा प्रयुक्त तंत्र यह आश्वासन देने के लिए कि एक समय में केवल एक धागा पायथन बाइटकोड को निष्पादित करता है। यह ऑब्जेक्ट मॉडल (महत्वपूर्ण अंतर्निहित प्रकारों जैसे कि तानाशाह सहित) को सुरक्षित रूप से समवर्ती पहुंच के खिलाफ सुरक्षित करके CPython कार्यान्वयन को सरल बनाता है। पूरे इंटरप्रिटर को लॉक करना इंटरप्रेटर को मल्टी-थ्रेडेड मशीन द्वारा वहन की जाने वाली समानता के अधिकांश की कीमत पर बहु-थ्रेडेड करना आसान बनाता है।
हालांकि, कुछ विस्तार मॉड्यूल, या तो मानक या तीसरे पक्ष के होते हैं, ताकि कंपिल या हैशिंग जैसे कम्प्यूटेशनल-गहन कार्यों को करते समय GIL को जारी किया जा सके। साथ ही, GIL हमेशा I / O करते समय जारी किया जाता है।
"फ्री-थ्रेडेड" दुभाषिया (जो बहुत अधिक बारीक ग्रैन्युलैरिटी पर साझा किए गए डेटा को लॉक करता है) बनाने के पिछले प्रयास सफल नहीं हुए हैं क्योंकि प्रदर्शन सामान्य एकल-प्रोसेसर मामले में भुगतना पड़ा है। यह माना जाता है कि इस प्रदर्शन के मुद्दे पर काबू पाने से कार्यान्वयन बहुत अधिक जटिल हो जाएगा और इसलिए इसे बनाए रखना महंगा हो जाएगा।
इस उद्धरण का यह भी अर्थ है कि dicts और इस प्रकार चर असाइनमेंट भी CPython कार्यान्वयन विवरण के रूप में सुरक्षित है:
इसके बाद, पैकेज के लिए डॉक्सmultiprocessing
समझाते हैं कि यह किस तरह से एक इंटरफ़ेस को उजागर करते समय स्पैनिंग प्रक्रिया द्वारा जीआईएल पर काबू पा लेता हैthreading
:
मल्टीप्रोसेसिंग एक पैकेज है जो थ्रेडिंग मॉड्यूल के समान एपीआई का उपयोग करके स्पैनिंग प्रक्रियाओं का समर्थन करता है। मल्टीप्रोसेसिंग पैकेज थ्रेड्स के बजाय सबप्रोसेस का उपयोग करके ग्लोबल इंटरप्रेटर लॉक को प्रभावी ढंग से साइड-स्टेपिंग करने के लिए स्थानीय और दूरस्थ दोनों संगामिति प्रदान करता है। इसके कारण, मल्टीप्रोसेसिंग मॉड्यूल प्रोग्रामर को दिए गए मशीन पर कई प्रोसेसर का पूरी तरह से लाभ उठाने की अनुमति देता है। यह यूनिक्स और विंडोज दोनों पर चलता है।
और के लिए डॉक्सconcurrent.futures.ProcessPoolExecutor
समझाने कि इसे इस्तेमाल करता है multiprocessing
एक बैकेंड के रूप में:
ProcessPoolExecutor वर्ग एक एक्ज़ीक्यूटर सबक्लास है जो अतुल्यकालिक कॉल को निष्पादित करने के लिए प्रक्रियाओं के एक पूल का उपयोग करता है। ProcessPoolExecutor मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करता है, जो इसे ग्लोबल इंटरप्रेटर लॉक को साइड-स्टेप करने की अनुमति देता है, लेकिन इसका अर्थ यह भी है कि केवल पिकेबल ऑब्जेक्ट्स को निष्पादित और वापस किया जा सकता है।
अन्य आधार वर्ग के विपरीत किया जाना चाहिए जो ThreadPoolExecutor
कि प्रक्रियाओं के बजाय धागे का उपयोग करता है
ThreadPoolExecutor एक Executor subclass है जो एसिंक्रोनस रूप से कॉल को निष्पादित करने के लिए थ्रेड्स के एक पूल का उपयोग करता है।
जिससे हम यह निष्कर्ष निकालते हैं कि ThreadPoolExecutor
मैं केवल I / O बाध्य कार्यों के लिए उपयुक्त है, जबकि ProcessPoolExecutor
CPU बाध्य कार्यों को भी संभाल सकता है।
निम्नलिखित प्रश्न पूछता है कि जीआईएल पहले स्थान पर क्यों मौजूद है: ग्लोबल इंटरप्रेटर लॉक क्यों?
प्रक्रिया बनाम धागा प्रयोग
पर Multiprocessing बनाम थ्रेडिंग अजगर मैं अजगर में धागे बनाम प्रक्रिया का एक प्रयोगात्मक विश्लेषण किया है।
परिणामों का त्वरित पूर्वावलोकन: