जावा वर्चुअल मशीन में कोई GIL क्यों नहीं है? अजगर को इतने बुरे की आवश्यकता क्यों है?


177

मैं उम्मीद कर रहा हूं कि कोई व्यक्ति जावा वर्चुअल मशीन के बारे में मौलिक रूप से कुछ अलग जानकारी प्रदान कर सकता है जो इसे ग्लोबल इंटरप्रेटर लॉक (जीआईएल) की आवश्यकता के बिना थ्रेड को कार्यान्वित करने की अनुमति देता है, जबकि पायथन को ऐसी बुराई की आवश्यकता होती है।

जवाबों:


223

पायथन (भाषा) को एक GIL की आवश्यकता नहीं है (यही कारण है कि यह पूरी तरह से JVM [Jython] और .NET [IronPython] पर लागू किया जा सकता है, और उन कार्यान्वयनों को स्वतंत्र रूप से गुणा किया जाता है)। सीपीथॉन (लोकप्रिय कार्यान्वयन) ने हमेशा कोडिंग में आसानी के लिए एक जीआईएल का उपयोग किया है (esp। कचरा संग्रह तंत्र की कोडिंग) और गैर-थ्रेड-सुरक्षित सी-कोडेड पुस्तकालयों के एकीकरण के लिए (वहाँ उन लोगों का एक टन हुआ करता था; -)।

Unladen निगल परियोजना, अन्य महत्वाकांक्षी लक्ष्य के बीच में, करता है की योजना अजगर के लिए एक जीआईएल मुक्त आभासी मशीन -। उस साइट उद्धृत करने के लिए, "इसके अलावा, हम जीआईएल हटाने और अजगर में multithreading के राज्य को ठीक करने का इरादा हम मानते हैं कि यह है एक अधिक परिष्कृत जीसी प्रणाली के कार्यान्वयन के माध्यम से संभव है, आईबीएम के रिसाइक्लर (बेकन एट अल, 2001) जैसा कुछ। "


6
एलेक्स, जीआईएल को हटाने के पुराने प्रयासों के बारे में, क्या उस के साथ ओवरहेड का एक टन नहीं था (2 का एक कारक जो मुझे याद है)?
बार्टोज़ रैदासीस्की

10
हाँ बार्टोज़, ग्रेग स्टीन ने 1999 में माप किया था। संदर्भ गिनती द्वारा कचरा संग्रह हत्यारा था, जिसमें भारी दाने वाले लॉकिंग के विशाल ओवरहेड थे। इसीलिए वहां अधिक उन्नत जीसी महत्वपूर्ण है।
एलेक्स मार्टेली


1
Unladen और CPython के विकल्प PyPy, Jython और IronPython हैं। बाद के दो में कोई GIL नहीं है, लेकिन मल्टीप्रोसेसिंग मॉड्यूल का उपयोग करने से GIL साइडस्टेप हो जाता है और वैसे भी सुरक्षित रहता है।
सीस टिमरमैन

50

जेवीएम (कम से कम हॉटस्पॉट) "जीआईएल" के लिए एक समान अवधारणा है, यह अपने लॉक ग्रैन्युलैरिटी में बहुत महीन है, इसमें से अधिकांश जीसी हॉटस्पॉट से आते हैं जो अधिक उन्नत हैं।

सीपीथॉन में यह एक बड़ा ताला है (शायद यह सच नहीं है, लेकिन तर्कों के लिए पर्याप्त अच्छा है), जेवीएम में यह विभिन्न अवधारणाओं के बारे में अधिक फैला हुआ है, जहां यह उपयोग किया जाता है।

उदाहरण के लिए, vm / runtime / safepoint.hpp को हॉटस्पॉट कोड में देखें, जो प्रभावी रूप से एक बाधा है। एक बार एक सुरक्षित स्थान पर पूरा वीएम जावा कोड के संबंध में बंद हो गया, बहुत कुछ जैसे पीएम वीएम जीआईएल पर रुक गया।

जावा दुनिया में ऐसी वीएम पॉज़िंग घटनाओं को "स्टॉप-द-वर्ल्ड" के रूप में जाना जाता है, इन बिंदुओं पर केवल मूल कोड जो कुछ मानदंडों के लिए बाध्य है, मुफ्त चल रहा है, बाकी वीएम को रोक दिया गया है।

इसके अलावा जावा में एक मोटे लॉक की कमी जेएनआई को लिखना अधिक कठिन बनाता है, क्योंकि जेवीएम एफएफआई कॉल के लिए अपने पर्यावरण के बारे में कम गारंटी देता है, उनमें से एक चीज़ जो कि कॉफ़ीथन काफी आसान बनाता है (हालांकि ctypes का उपयोग करना उतना आसान नहीं है)।


7

इस ब्लॉग पोस्ट में नीचे एक टिप्पणी है http://www.grouplens.org/node/244 जो संकेत देता है कि इस कारण से कि आयरनप्थॉन या जाइथॉन के लिए जीआईएल के साथ यह इतना आसान क्यों है, यह है कि सीपीयॉन संदर्भ गिनती का उपयोग करता है जबकि अन्य 2 वीएम में कचरा संग्रहकर्ता हैं।

ऐसा क्यों है, इसके सटीक मैकेनिक मुझे नहीं मिलते, लेकिन यह एक प्रशंसनीय कारण लगता है।


5
जब आप थ्रेड के बीच ऑब्जेक्ट्स को साझा कर रहे होते हैं, जब कोई विशेष वस्तु का संदर्भ नहीं होता है, तो कोई और अधिक मामूली होता है। वैश्विक लॉक के साथ संदर्भ की गिनती एक (महंगा) तरीका है। इसे हल करने का एक अलग तरीका यह होगा कि एक समय में केवल एक थ्रेड को ऑब्जेक्ट के संदर्भ में रखा जाए, जिससे अधिकांश गतिविधि थ्रेड-लोकल होगी, जो इंटर-थ्रेड कम्युनिकेशन को और अधिक अजीब बना देगा। व्यक्तिगत रूप से, मुझे लगता है कि यह बता रहा है कि एचपीसी प्रोसेसर और संदेश साझा न करने के बीच संदेश-पासिंग का उपयोग करता है, और यह स्केलेबिलिटी कारणों के लिए ऐसा करता है ...
डोनाल्ड फेलो

0

इस लिंक में उनके पास निम्नलिखित स्पष्टीकरण है:

... "इंटरप्रेटर के कुछ हिस्सों को थ्रेडसेफ़ नहीं किया जाता है, हालांकि ज्यादातर क्योंकि बड़े लॉक के उपयोग से सभी थ्रेडसेफ़ बनाते हैं, यह एकल-थ्रेडेड अत्यंत ( स्रोत ) को धीमा कर देगा । यह रेफ़रेंस काउंटिंग (जेवीएम) का उपयोग करके सीपीथॉन कचरा कलेक्टर से संबंधित लगता है। और CLR नहीं करता है, और इसलिए हर बार एक संदर्भ गणना को लॉक / रिलीज़ करने की आवश्यकता नहीं है)। लेकिन भले ही किसी ने स्वीकार्य समाधान के बारे में सोचा हो और इसे लागू किया हो, तीसरे पक्ष के पुस्तकालयों में अभी भी वही समस्याएं होंगी। "


-1

पायथन में jit / aot का अभाव है और यह मल्टीथ्रेडेड प्रोसेसर में लिखे गए समय सीमा का अस्तित्व नहीं था। वैकल्पिक रूप से आप जूलिया लैंग में सब कुछ फिर से जोड़ सकते हैं जिसमें जीआईएल की कमी है और आपके पायथन कोड पर कुछ गति को बढ़ावा देता है। इसके अलावा Jython तरह की बेकार है यह Cpython और Java की तुलना में धीमी है। यदि आप समानांतर प्लगइन्स का उपयोग करने पर विचार करने के लिए पाइथन से चिपकना चाहते हैं, तो आपको त्वरित गति बढ़ाने का लाभ नहीं मिलेगा, लेकिन आप सही प्लगइन के साथ समानांतर प्रोग्रामिंग कर सकते हैं।


PyPy के बारे में क्या?
डेनिस 631
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.