इस लेख में, हम पाइथन ग्लोबल इंटरप्रेटर लॉक (जीआईएल) के बारे में जानेंगे।
यह एक ताला या बाधा है जो एक साथ कई थ्रेड्स के लिए पायथन इंटरप्रेटर की उपलब्धता को रोकता है। GIL को Python 3.x में एक दोष/समस्या के रूप में पहचाना जाता है। या इससे पहले क्योंकि यह मल्टी-थ्रेडेड आर्किटेक्चर में मल्टीथ्रेडिंग की अनुमति नहीं देता है।
इसे क्यों पेश किया गया है?
पायथन स्वचालित कचरा संग्रह की अवधारणा का समर्थन करता है। जैसे ही किसी वस्तु की संदर्भ संख्या शून्य तक पहुँचती है, स्मृति साफ हो जाती है और उपयोग के लिए मुक्त हो जाती है।
>>> import sys >>> var = {} >>> print(sys.getrefcount(ar)) >>> 2 >>> v=var >>> print(sys.getrefcount(v)) >>> 3
इस मामले में यदि संदर्भ संख्या घटने लगती है और एक साथ बढ़ने लगती है तो स्वचालित संग्राहक ठीक से काम नहीं कर पाएगा और इसलिए स्मृति रिसाव की संभावना बढ़ जाती है।
इस जोखिम को कम करने के लिए जीआईएल को पायथन में पेश किया गया था। ग्लोबल लॉक को जोड़ना प्रत्येक वेरिएबल में लॉक जोड़ने से बेहतर माना जाता है जिसके परिणामस्वरूप लॉक की एक श्रृंखला गतिरोध की ओर ले जाती है।
पायथन में GIL अभी भी क्यों मौजूद है
जीआईएल में सुधार की जरूरत है ताकि हम इसे बेहतर तरीके से संभाल सकें। इसलिए हम GIL को हटाने के बजाय GIL की अवधारणा को सुधारने पर काम कर रहे हैं। चूंकि अजगर पूरी तरह से c और cpython के आधार से जुड़ा हुआ है, इसलिए हम सीधे गिल को नहीं हटा सकते। यद्यपि जीआईएल द्वारा हल की जाने वाली समस्याओं को संभालने के लिए कई तरीके हैं, जिन्हें लागू करना मुश्किल है और सिस्टम के प्रोसेसिंग और रन टाइम को कम करना है।
उदाहरण के लिए,
मान लीजिए कि प्रक्रिया P1 में थ्रेड t1 और t2 चल रहे हैं। पायथन थ्रेड्स स्वभाव से देशी होते हैं, अंतर्निहित ऑपरेटिंग सिस्टम द्वारा शेड्यूल किए जाते हैं।
t1 रनिंग (रन स्टेज) (GIL का अधिग्रहण) → t1 I/O (इन/आउट) के लिए प्रतीक्षा कर रहा है (GIL जारी करता है) → t2 रनिंग (रन स्टेज) (GIL का अधिग्रहण करता है, इस समय तक t1 भी चलने के लिए तैयार है लेकिन GIL का अधिग्रहण कर लिया गया है) द्वारा t2)
इसलिए, यहां जीआईएल प्रमुख प्रतिबंध बन जाता है। इसलिए, यदि हम एक बहु-थ्रेडेड पायथन एप्लिकेशन/मॉड्यूल लिखना चाहते हैं जो भारी CPU बाध्य संचालन करता है, तो वांछित परिणाम प्राप्त करना असंभव हो जाता है।
क्योंकि, पायथन में वास्तविक मल्टी-थ्रेडिंग संभव नहीं है, क्योंकि मल्टीकोर सीपीयू उपलब्ध होने पर भी प्रभावी रूप से प्रक्रिया एक समय में केवल एक सीपीयू का उपयोग करेगी।
हालांकि, अधिकांश पायथन एप्लिकेशन (वेब एप्लिकेशन, Django आधारित सर्वर, आदि) में, यह कोई समस्या नहीं है क्योंकि ये एप्लिकेशन I/O प्रकृति से बंधे हैं।
एक पायथन प्रोग्रामर के रूप में, हमें तब तक जीआईएल प्राप्त करने और जारी करने से निपटने की ज़रूरत नहीं है जब तक कि हम सी/सी ++ मॉड्यूल/स्क्रिप्ट नहीं लिख रहे हैं जो पाइथन में निष्पादन योग्य हैं
निष्कर्ष
इस लेख में, हमने पायथन ग्लोबल इंटरप्रेटर लॉक, इसके महत्व और सीधे अजगर से क्यों नहीं हटाया जा सकता है, के बारे में सीखा।