नोट: जहाँ भी मेरा उल्लेख है, threadमेरा मतलब है कि विशेष रूप से अजगर में धागे स्पष्ट रूप से कहा गया है।
यदि आप C/C++पृष्ठभूमि से आ रहे हैं तो थ्रेड्स अजगर में थोड़ा अलग तरीके से काम करते हैं । अजगर में, केवल एक धागा दिए गए समय पर चालू स्थिति में हो सकता है। इसका मतलब है कि अजगर में धागे वास्तव में कई प्रसंस्करण कोर की शक्ति का लाभ नहीं उठा सकते हैं क्योंकि डिजाइन के लिए धागे के लिए कई कोर पर समानांतर रूप से चलाना संभव नहीं है।
के रूप में अजगर में स्मृति प्रबंधन धागा सुरक्षित नहीं है प्रत्येक धागे को अजगर इंटरप्रेटर में डेटा संरचनाओं के लिए एक विशेष पहुंच की आवश्यकता होती है। यह अनन्य उपयोग एक तंत्र (वैश्विक इंटरप्रिट लॉक) द्वारा अधिग्रहित किया जाता है ।GIL
Why does python use GIL?
एक साथ दुभाषिया राज्य तक पहुँचने और दुभाषिया राज्य को दूषित करने से कई धागों को रोकने के लिए।
विचार यह है कि जब भी किसी थ्रेड को निष्पादित किया जा रहा है (भले ही यह मुख्य धागा हो) , एक GIL का अधिग्रहण किया जाता है और समय के कुछ पूर्वनिर्धारित अंतराल के बाद GIL को वर्तमान थ्रेड द्वारा जारी किया जाता है और कुछ अन्य थ्रेड (यदि कोई हो) द्वारा पुनः प्राप्त किया जाता है।
Why not simply remove GIL?
ऐसा नहीं है कि जीआईएल को हटाना असंभव है, ऐसा सिर्फ इस तरह से करना है कि हम अंत तक पहुंचने के क्रम में इंटरप्रेटर के अंदर म्यूटेंट लॉक लगाते हैं, जिससे एक भी थ्रेडेड एप्लिकेशन कम परफॉर्म करता है।
इसलिए जीआईएल को हटाने की लागत का भुगतान एक एकल थ्रेडेड अनुप्रयोग के कम प्रदर्शन द्वारा किया जाता है, जो कभी वांछित नहीं होता है।
So when does thread switching occurs in python?
जब GIL जारी किया जाता है तब थ्रेड स्विच होता है। GIL का विमोचन कब किया जाता है? विचार करने के लिए दो परिदृश्य हैं।
यदि कोई थ्रेड CPU बाउंड ऑपरेशंस (Ex इमेज प्रोसेसिंग) कर रहा है।
अजगर के पुराने संस्करणों में, थ्रेड स्विचिंग का उपयोग अजगर के निर्देशों के एक निश्चित संख्या के बाद हुआ करता था 100। यह डिफ़ॉल्ट रूप से सेट किया गया था । मिलिसेकंड से लेकर एक सेकंड तक बहुत बेतहाशा कर सकते हैं। हर 100निर्देश के बाद जीआईएल को जारी करना, भले ही वे निष्पादित करने के लिए एक खराब नीति है।
थ्रेड स्विच करने के लिए मीट्रिक के रूप में निर्देश गणना का उपयोग करने के बजाय नए संस्करणों में, एक कॉन्फ़िगर करने योग्य समय अंतराल का उपयोग किया जाता है। डिफ़ॉल्ट स्विच अंतराल 5 मिलीसेकेंड है। आप वर्तमान स्विच अंतराल का उपयोग करके प्राप्त कर सकते हैं sys.getswitchinterval()। यह प्रयोग करके बदला जा सकता हैsys.setswitchinterval()
यदि कोई थ्रेड कुछ IO बाउंड ऑपरेशन कर रहा है (Ex फाइल सिस्टम एक्सेस या
नेटवर्क IO)
जब भी थ्रेड IO ऑपरेशन के पूरा होने की प्रतीक्षा कर रहा है, तब GIL जारी है।
Which thread to switch to next?
दुभाषिया का अपना शेड्यूलर नहीं है। जो थ्रेड अंतराल के अंत में अनुसूचित हो जाता है वह ऑपरेटिंग सिस्टम का निर्णय है। ।