Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

क्या है पायथन ग्लोबल इंटरप्रेटर लॉक (GIL)

इस लेख में, हम पाइथन ग्लोबल इंटरप्रेटर लॉक (जीआईएल) के बारे में जानेंगे।

यह एक ताला या बाधा है जो एक साथ कई थ्रेड्स के लिए पायथन इंटरप्रेटर की उपलब्धता को रोकता है। GIL को Python 3.x में एक दोष/समस्या के रूप में पहचाना जाता है। या इससे पहले क्योंकि यह मल्टी-थ्रेडेड आर्किटेक्चर में मल्टीथ्रेडिंग की अनुमति नहीं देता है।

इसे क्यों पेश किया गया है?

पायथन स्वचालित कचरा संग्रह की अवधारणा का समर्थन करता है। जैसे ही किसी वस्तु की संदर्भ संख्या शून्य तक पहुँचती है, स्मृति साफ हो जाती है और उपयोग के लिए मुक्त हो जाती है।

>>> import sys
>>> var = {}
>>> print(sys.getrefcount(ar))
>>> 2
>>> v=var
>>> print(sys.getrefcount(v))
>>> 3

इस मामले में यदि संदर्भ संख्या घटने लगती है और एक साथ बढ़ने लगती है तो स्वचालित संग्राहक ठीक से काम नहीं कर पाएगा और इसलिए स्मृति रिसाव की संभावना बढ़ जाती है।

इस जोखिम को कम करने के लिए जीआईएल को पायथन में पेश किया गया था। ग्लोबल लॉक को जोड़ना प्रत्येक वेरिएबल में लॉक जोड़ने से बेहतर माना जाता है जिसके परिणामस्वरूप लॉक की एक श्रृंखला गतिरोध की ओर ले जाती है।

क्या है पायथन ग्लोबल इंटरप्रेटर लॉक (GIL)

पायथन में GIL अभी भी क्यों मौजूद है

जीआईएल में सुधार की जरूरत है ताकि हम इसे बेहतर तरीके से संभाल सकें। इसलिए हम GIL को हटाने के बजाय GIL की अवधारणा को सुधारने पर काम कर रहे हैं। चूंकि अजगर पूरी तरह से c और cpython के आधार से जुड़ा हुआ है, इसलिए हम सीधे गिल को नहीं हटा सकते। यद्यपि जीआईएल द्वारा हल की जाने वाली समस्याओं को संभालने के लिए कई तरीके हैं, जिन्हें लागू करना मुश्किल है और सिस्टम के प्रोसेसिंग और रन टाइम को कम करना है।

उदाहरण के लिए,

मान लीजिए कि प्रक्रिया P1 में थ्रेड t1 और t2 चल रहे हैं। पायथन थ्रेड्स स्वभाव से देशी होते हैं, अंतर्निहित ऑपरेटिंग सिस्टम द्वारा शेड्यूल किए जाते हैं।

t1 रनिंग (रन स्टेज) (GIL का अधिग्रहण) → t1 I/O (इन/आउट) के लिए प्रतीक्षा कर रहा है (GIL जारी करता है) → t2 रनिंग (रन स्टेज) (GIL का अधिग्रहण करता है, इस समय तक t1 भी चलने के लिए तैयार है लेकिन GIL का अधिग्रहण कर लिया गया है) द्वारा t2)

इसलिए, यहां जीआईएल प्रमुख प्रतिबंध बन जाता है। इसलिए, यदि हम एक बहु-थ्रेडेड पायथन एप्लिकेशन/मॉड्यूल लिखना चाहते हैं जो भारी CPU बाध्य संचालन करता है, तो वांछित परिणाम प्राप्त करना असंभव हो जाता है।

क्योंकि, पायथन में वास्तविक मल्टी-थ्रेडिंग संभव नहीं है, क्योंकि मल्टीकोर सीपीयू उपलब्ध होने पर भी प्रभावी रूप से प्रक्रिया एक समय में केवल एक सीपीयू का उपयोग करेगी।

हालांकि, अधिकांश पायथन एप्लिकेशन (वेब ​​एप्लिकेशन, Django आधारित सर्वर, आदि) में, यह कोई समस्या नहीं है क्योंकि ये एप्लिकेशन I/O प्रकृति से बंधे हैं।

एक पायथन प्रोग्रामर के रूप में, हमें तब तक जीआईएल प्राप्त करने और जारी करने से निपटने की ज़रूरत नहीं है जब तक कि हम सी/सी ++ मॉड्यूल/स्क्रिप्ट नहीं लिख रहे हैं जो पाइथन में निष्पादन योग्य हैं

निष्कर्ष

इस लेख में, हमने पायथन ग्लोबल इंटरप्रेटर लॉक, इसके महत्व और सीधे अजगर से क्यों नहीं हटाया जा सकता है, के बारे में सीखा।


  1. पायथन में मुखर कथन का क्या उपयोग है?

    मुखर कथन में निम्नलिखित वाक्य रचना है। assert <some_test>, <message> उपरोक्त पंक्ति को इस प्रकार पढ़ा जाता है:यदि का मूल्यांकन गलत होता है, तो एक अपवाद उठाया जाता है और आउटपुट होगा। यदि हम कुछ कोड ब्लॉक या एक एक्सप्रेशन का परीक्षण करना चाहते हैं तो हम इसे एक assert कीवर्ड के बाद रखते

  1. पायथन फ़ंक्शन नामों में अनुमत वर्ण क्या हैं?

    पायथन पहचानकर्ता पहचानकर्ता पायथन में वर्ग, कार्य, चर आदि जैसी संस्थाओं को दिया गया नाम है। यह एक इकाई को दूसरे से जानने में मदद करता है। पहचानकर्ता लिखने के नियम पहचानकर्ता लोअरकेस अक्षरों (ए से जेड) या अपरकेस अक्षरों (ए से जेड) या अंक (0 से 9) या अंडरस्कोर (_) का संयोजन हो सकता है। myClass, v

  1. पायथन में वैश्विक और स्थानीय चर के बीच क्या अंतर है?

    वैश्विक चर एक ऐसा चर है जो विश्व स्तर पर पहुंच योग्य है। एक स्थानीय चर वह है जो केवल वर्तमान दायरे तक ही पहुंच योग्य है, जैसे कि किसी एकल फ़ंक्शन परिभाषा में उपयोग किए जाने वाले अस्थायी चर। उदाहरण दिए गए कोड में q = "I love coffee" # global variable def f():     p = "Me Tarz