पायथन के कई कार्यान्वयन हैं, उदाहरण के लिए, CPython, IronPython, RPython, आदि।
उनमें से कुछ के पास GIL है, कुछ के पास नहीं है। उदाहरण के लिए, CPython में GIL है:
से http://en.wikipedia.org/wiki/Global_Interpreter_Lock
जीआईएल के साथ प्रोग्रामिंग भाषाओं में लिखे गए अनुप्रयोगों को पूर्ण समानता प्राप्त करने के लिए अलग-अलग प्रक्रियाओं का उपयोग करने के लिए डिज़ाइन किया जा सकता है, क्योंकि प्रत्येक प्रक्रिया का अपना दुभाषिया होता है और बदले में उसका अपना GIL होता है।
GIL के लाभ
- एकल-थ्रेडेड कार्यक्रमों की वृद्धि की गति।
- सी पुस्तकालयों का आसान एकीकरण जो आमतौर पर थ्रेड-सुरक्षित नहीं होते हैं।
क्यों अजगर (CPython और अन्य) GIL का उपयोग करता है
CPython में, वैश्विक दुभाषिया लॉक या GIL, एक म्यूटेक्स है जो एक ही समय में कई देशी थ्रेड्स को पायथन बाइटकोड को निष्पादित करने से रोकता है। यह ताला मुख्य रूप से आवश्यक है क्योंकि सीपीथॉन का मेमोरी प्रबंधन थ्रेड-सुरक्षित नहीं है।
जीआईएल विवादास्पद है क्योंकि यह कुछ स्थितियों में मल्टीथ्रेडर सीपीथॉन कार्यक्रमों को मल्टीप्रोसेसर सिस्टम का पूर्ण लाभ लेने से रोकता है। ध्यान दें कि संभावित रूप से अवरुद्ध या लंबे समय तक चलने वाले संचालन, जैसे कि I / O, इमेज प्रोसेसिंग और NumPy नंबर क्रंचिंग, GIL के बाहर होते हैं। इसलिए यह केवल उन बहुस्तरीय कार्यक्रमों में है जो GIL के अंदर बहुत समय बिताते हैं, CPython bytecode की व्याख्या करते हुए, कि GIL एक अड़चन बन जाता है।
कई कारणों से ठीक-ठाक ताला लगाने के विरोध में अजगर के पास एक GIL है:
यह एकल-थ्रेडेड मामले में तेज है।
यह आई / ओ बाध्य कार्यक्रमों के लिए बहु-थ्रेडेड मामले में तेज है।
यह सीपीयू-बाउंड कार्यक्रमों के लिए बहु-थ्रेडेड मामले में तेज है जो सी पुस्तकालयों में अपने कम्प्यूट-गहन काम करते हैं।
यह सी एक्सटेंशन को लिखना आसान बनाता है: जहां आप इसे होने देते हैं (यानी Py_BEGIN_ALLOW_THREADS और Py_END_ALLOW_THREADS मैक्रोज़ के बीच) को छोड़कर, पायथन थ्रेड्स का कोई स्विच नहीं होगा।
यह C पुस्तकालयों को लपेटना आसान बनाता है। आपको थ्रेड-सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है। यदि लाइब्रेरी थ्रेड-सुरक्षित नहीं है, तो आप कॉल करते समय बस GIL को बंद रखते हैं।
GIL को C एक्सटेंशन द्वारा जारी किया जा सकता है। पायथन की मानक लाइब्रेरी प्रत्येक अवरोधक i / o कॉल के आसपास GIL जारी करती है। इस प्रकार GIL का i / o बाउंड सर्वर के प्रदर्शन के लिए कोई परिणाम नहीं है। आप इस प्रकार प्रक्रियाओं (कांटा), धागे या अतुल्यकालिक i / o का उपयोग करके पायथन में नेटवर्किंग सर्वर बना सकते हैं, और GIL आपके रास्ते में नहीं आएगा।
सी या फोरट्रान में संख्यात्मक पुस्तकालयों को इसी तरह जारी किए गए जीआईएल के साथ बुलाया जा सकता है। जबकि आपका सी एक्सटेंशन FFT के पूरा होने की प्रतीक्षा कर रहा है, दुभाषिया अन्य पायथन थ्रेड को निष्पादित करेगा। इस प्रकार एक जीआईएल इस मामले में ठीक-ठीक लॉकिंग की तुलना में आसान और तेज़ है। यह संख्यात्मक कार्य के थोक का गठन करता है। NumPy एक्सटेंशन जब भी संभव हो GIL जारी करता है।
थ्रेड आमतौर पर ज्यादातर सर्वर प्रोग्राम लिखने का एक बुरा तरीका है। यदि लोड कम है, तो फोर्किंग आसान है। यदि भार अधिक है, तो एसिंक्रोनस i / o और ईवेंट-चालित प्रोग्रामिंग (जैसे पायथन ट्विस्टेड फ्रेमवर्क का उपयोग करना) बेहतर है। धागे का उपयोग करने का एकमात्र बहाना विंडोज पर os.fork की कमी है।
जीआईएल एक समस्या है अगर, और केवल अगर, आप शुद्ध अजगर में सीपीयू-गहन कार्य कर रहे हैं। यहां आप प्रक्रियाओं और संदेश-पासिंग (उदाहरण के लिए mpi4py) का उपयोग करके क्लीनर डिजाइन प्राप्त कर सकते हैं। पायथन चीज़ की दुकान में एक 'प्रोसेसिंग' मॉड्यूल भी है, जो थ्रेड्स के रूप में एक ही इंटरफ़ेस देता है (यानी थ्रेडिंग को बदलें। प्रसंस्करण के साथ फैलाएं)।
जीआईएल की परवाह किए बिना जीयूआई की प्रतिक्रिया बनाए रखने के लिए थ्रेड्स का उपयोग किया जा सकता है। यदि जीआईएल आपके प्रदर्शन को प्रभावित करता है (ऊपर की चर्चा), तो आप अपने धागे को एक प्रक्रिया दे सकते हैं और इसके खत्म होने का इंतजार कर सकते हैं।