पायथन के ग्लोबल इंटरप्रेटर लॉक का कार्य वास्तव में क्या है? क्या अन्य भाषाएँ जो बायटेकोड के लिए संकलित हैं, एक समान तंत्र को नियोजित करती हैं?
पायथन के ग्लोबल इंटरप्रेटर लॉक का कार्य वास्तव में क्या है? क्या अन्य भाषाएँ जो बायटेकोड के लिए संकलित हैं, एक समान तंत्र को नियोजित करती हैं?
जवाबों:
सामान्य तौर पर, किसी भी थ्रेड सुरक्षा समस्या के लिए आपको ताले के साथ अपने आंतरिक डेटा संरचनाओं की रक्षा करने की आवश्यकता होगी। यह विभिन्न स्तर की ग्रैन्युलैरिटी के साथ किया जा सकता है।
आप बारीक-बारीक लॉकिंग का उपयोग कर सकते हैं, जहां हर अलग संरचना का अपना लॉक होता है।
आप मोटे अनाज वाले लॉकिंग का उपयोग कर सकते हैं जहां एक लॉक सब कुछ (जीआईएल दृष्टिकोण) की रक्षा करता है।
प्रत्येक विधि के विभिन्न पेशेवरों और विपक्ष हैं। बारीक दाने वाली लॉकिंग अधिक समानता की अनुमति देती है - दो धागे समानांतर में निष्पादित कर सकते हैं जब वे किसी भी संसाधन को साझा नहीं करते हैं। हालाँकि बहुत बड़ा प्रशासनिक ओवरहेड है। कोड की प्रत्येक पंक्ति के लिए, आपको कई ताले प्राप्त करने और जारी करने की आवश्यकता हो सकती है।
मोटे दानेदार दृष्टिकोण इसके विपरीत है। दो धागे एक ही समय में नहीं चल सकते हैं, लेकिन एक अलग धागा तेजी से चलेगा क्योंकि यह इतना बहीखाता नहीं कर रहा है। अंततः यह एकल-थ्रेडेड गति और समानता के बीच एक ट्रेडऑफ के लिए नीचे आता है।
अजगर में जीआईएल को हटाने के लिए कुछ प्रयास किए गए हैं, लेकिन एकल थ्रेडेड मशीनों के लिए अतिरिक्त ओवरहेड आमतौर पर बहुत बड़ा था। कुछ मामले वास्तव में लॉक कंटेंट के कारण मल्टी-प्रोसेसर मशीनों पर भी धीमे हो सकते हैं।
क्या अन्य भाषाएँ जो बायटेकोड के लिए संकलित हैं, एक समान तंत्र को नियोजित करती हैं?
यह भिन्न होता है, और इसे शायद एक भाषा संपत्ति नहीं माना जाना चाहिए, जितना कि एक कार्यान्वयन संपत्ति। उदाहरण के लिए, अजगर और आयरनपिथॉन जैसे पायथन कार्यान्वयन हैं जो एक जीआईएल दृष्टिकोण के बजाय अपने अंतर्निहित वीएम के थ्रेडिंग दृष्टिकोण का उपयोग करते हैं। इसके अतिरिक्त, रूबी का अगला संस्करण जीआईएल को पेश करने की ओर अग्रसर है ।
निम्नलिखित आधिकारिक पायथन / सी एपीआई संदर्भ मैनुअल से है :
पायथन दुभाषिया पूरी तरह से सुरक्षित धागा नहीं है। बहु-थ्रेडेड पायथन कार्यक्रमों का समर्थन करने के लिए, एक वैश्विक ताला है जिसे वर्तमान धागे द्वारा सुरक्षित रूप से पायथन ऑब्जेक्ट्स तक पहुंचने से पहले आयोजित किया जाना चाहिए। लॉक के बिना, यहां तक कि सबसे सरल संचालन भी एक बहु-थ्रेडेड प्रोग्राम में समस्याएं पैदा कर सकता है: उदाहरण के लिए, जब दो धागे एक साथ एक ही वस्तु के संदर्भ गणना को बढ़ाते हैं, तो संदर्भ गणना दो बार के बजाय केवल एक बार बढ़ाई जा सकती है।
इसलिए, नियम मौजूद है कि केवल वैश्विक इंटरप्रेटर लॉक का अधिग्रहण करने वाला धागा पायथन ऑब्जेक्ट्स पर काम कर सकता है या पायथन / सी एपीआई फ़ंक्शन को कॉल कर सकता है। बहु-पिरोया पायथन कार्यक्रमों का समर्थन करने के लिए, दुभाषिया नियमित रूप से रिलीज़ करता है और लॉक को फिर से प्राप्त करता है - डिफ़ॉल्ट रूप से, प्रत्येक 100 बायटेकोड निर्देश (इसे sys.setcheckinterval ()) के साथ बदला जा सकता है। लॉक को भी रिलीज़ किया जाता है और संभावित रूप से अवरुद्ध I / O संचालन के आसपास पुनः प्राप्त किया जाता है जैसे फ़ाइल पढ़ना या लिखना, ताकि अन्य थ्रेड्स चल सकें जबकि I / O अनुरोध करने वाले थ्रेड I / O ऑपरेशन के पूरा होने की प्रतीक्षा कर रहा है।
मुझे लगता है कि यह बहुत अच्छी तरह से इस मुद्दे को बोता है।
वैश्विक दुभाषिया ताला एक बड़ा म्यूटेक्स-प्रकार का ताला है जो संदर्भ काउंटर को चपेट में लेने से बचाता है। यदि आप शुद्ध अजगर कोड लिख रहे हैं, तो यह सब पर्दे के पीछे होता है, लेकिन यदि आप पायथन को सी में एम्बेड करते हैं, तो आपको लॉक को स्पष्ट रूप से लेना / जारी करना पड़ सकता है।
यह तंत्र बाइटकोड द्वारा संकलित होने वाले पायथन से संबंधित नहीं है। यह जावा के लिए आवश्यक नहीं है। वास्तव में, यह Jython (jvm के लिए संकलित अजगर) के लिए भी आवश्यक नहीं है ।
यह प्रश्न भी देखें
पायल 5 की तरह, पायथन को जमीन से डिज़ाइन नहीं किया गया था ताकि धागा सुरक्षित रहे। इस तथ्य के बाद थ्रेड्स का मसौदा तैयार किया गया था, इसलिए पारस्परिक व्याख्या को बनाए रखने के लिए वैश्विक दुभाषिया लॉक का उपयोग किया जाता है, जहां केवल एक धागा दुभाषिया के आंतों में एक निश्चित समय पर कोड निष्पादित कर रहा है।
व्यक्तिगत पायथन थ्रेड्स को इंटरप्रेटर द्वारा सहकारी रूप से लॉक किया जाता है ताकि हर बार लॉक को साइकलिंग किया जा सके।
ताला को हथियाने की जरूरत तब पड़ती है जब आप C से अजगर से बात कर रहे होते हैं जब अन्य Python धागे इस प्रोटोकॉल में 'ऑप्ट' करने के लिए सक्रिय होते हैं और सुनिश्चित करते हैं कि आपकी पीठ के पीछे असुरक्षित कुछ भी नहीं होता है।
अन्य प्रणालियों में एक एकल-पिरोया विरासत है जो बाद में दलित प्रणालियों में विकसित हुई, अक्सर इस प्रकार के कुछ तंत्र होते हैं। उदाहरण के लिए, लिनक्स कर्नेल में "बिग कर्नेल लॉक" अपने शुरुआती एसएमपी दिनों से है। धीरे-धीरे समय के साथ-साथ मल्टी-थ्रेडिंग प्रदर्शन एक मुद्दा बन जाता है, इन प्रकार के तालों को छोटे टुकड़ों में तोड़ने या लॉक-फ्री एल्गोरिदम और डेटा संरचनाओं के साथ बदलने की कोशिश करने की प्रवृत्ति होती है, जहां से थ्रूपुट को अधिकतम करना संभव होता है।
reiserfs
- एकमात्र वास्तविक कारण जो मुझे इसके बारे में पता है)।
आपके दूसरे प्रश्न के बारे में, सभी स्क्रिप्टिंग भाषाएं इसका उपयोग नहीं करती हैं, लेकिन यह केवल उन्हें कम शक्तिशाली बनाता है। उदाहरण के लिए, रूबी में धागे हरे रंग के होते हैं, देशी नहीं।
पायथन में, धागे मूल हैं और जीआईएल केवल उन्हें अलग-अलग कोर पर चलने से रोकता है।
पर्ल में, धागे और भी बदतर हैं। वे बस पूरे दुभाषिया की नकल करते हैं, और अजगर के रूप में प्रयोग करने योग्य होने से बहुत दूर हैं।
शायद BDFL का यह लेख मदद करेगा।