क्यों अजगर को GIL के साथ लिखा गया था?


112

वैश्विक दुभाषिया ताला (जीआईएल) को अक्सर एक प्रमुख कारण के रूप में उद्धृत किया जाता है क्यों थ्रेडिंग और जैसे पाइथन में एक स्पर्श मुश्किल है - जो सवाल उठाता है "ऐसा पहले स्थान पर क्यों किया गया था?"

एक प्रोग्रामर होने के नाते, मुझे कोई सुराग नहीं मिला कि ऐसा क्यों हो सकता है - जीआईएल में डालने के पीछे तर्क क्या था?


10
विकिपीडिया लेख कहा गया है कि "गिल समानांतरवाद-एक कीमत भाषा की गतिशीलता होने के लिए भुगतान के लिए एक महत्वपूर्ण बाधा हो सकता है" , और कहना है कि पर चला जाता है "इस तरह के एक ताला को रोजगार के लिए कारणों में शामिल हैं: एकल पिरोया कार्यक्रमों की वृद्धि की गति (अलग से सभी डेटा संरचनाओं पर ताले प्राप्त करने या जारी करने की कोई आवश्यकता नहीं), और सी पुस्तकालयों का आसान एकीकरण जो आमतौर पर थ्रेड-सुरक्षित नहीं हैं। "
रॉबर्ट हार्वे

3
@ रोबर्टहार्इ, डायनेमिज्म का इससे कोई लेना-देना नहीं है। समस्या उत्परिवर्तन है।
dan_waterworth


1
यह महसूस करने में मदद नहीं कर सकता है कि जावा के अहस्ताक्षरित अंकों की कमी के कारण, यह उन लोगों को रोकने के लिए था जो यह नहीं जानते कि वे पैर में खुद को गोली मार रहे हैं। दुर्भाग्य से, जो कोई भी जानता है कि वे क्या कर रहे हैं एक कमी वाली भाषा मिलती है, जो एक वास्तविक शर्म की बात है क्योंकि इतने सारे अन्य तरीकों से पायथन चट्टानें
बेसिक

1
@Basic को क्रिप्टो गणित करने के लिए जावा में बाइट सरणियों से निपटने के लिए कुछ मानक तरीका है (मैंने इसे लंबे समय में इस्तेमाल नहीं किया है)। पायथन (उदाहरण के लिए) के पास हस्ताक्षरित संख्या नहीं है, लेकिन मैं इसके साथ बिटवाइज़ ऑप्स करने की कोशिश भी नहीं करूंगा क्योंकि बेहतर तरीके हैं।
निक टी

जवाबों:


105

पायथन के कई कार्यान्वयन हैं, उदाहरण के लिए, CPython, IronPython, RPython, आदि।

उनमें से कुछ के पास GIL है, कुछ के पास नहीं है। उदाहरण के लिए, CPython में GIL है:

से http://en.wikipedia.org/wiki/Global_Interpreter_Lock

जीआईएल के साथ प्रोग्रामिंग भाषाओं में लिखे गए अनुप्रयोगों को पूर्ण समानता प्राप्त करने के लिए अलग-अलग प्रक्रियाओं का उपयोग करने के लिए डिज़ाइन किया जा सकता है, क्योंकि प्रत्येक प्रक्रिया का अपना दुभाषिया होता है और बदले में उसका अपना GIL होता है।

GIL के लाभ

  • एकल-थ्रेडेड कार्यक्रमों की वृद्धि की गति।
  • सी पुस्तकालयों का आसान एकीकरण जो आमतौर पर थ्रेड-सुरक्षित नहीं होते हैं।

क्यों अजगर (CPython और अन्य) GIL का उपयोग करता है

CPython में, वैश्विक दुभाषिया लॉक या GIL, एक म्यूटेक्स है जो एक ही समय में कई देशी थ्रेड्स को पायथन बाइटकोड को निष्पादित करने से रोकता है। यह ताला मुख्य रूप से आवश्यक है क्योंकि सीपीथॉन का मेमोरी प्रबंधन थ्रेड-सुरक्षित नहीं है।

जीआईएल विवादास्पद है क्योंकि यह कुछ स्थितियों में मल्टीथ्रेडर सीपीथॉन कार्यक्रमों को मल्टीप्रोसेसर सिस्टम का पूर्ण लाभ लेने से रोकता है। ध्यान दें कि संभावित रूप से अवरुद्ध या लंबे समय तक चलने वाले संचालन, जैसे कि I / O, इमेज प्रोसेसिंग और NumPy नंबर क्रंचिंग, GIL के बाहर होते हैं। इसलिए यह केवल उन बहुस्तरीय कार्यक्रमों में है जो GIL के अंदर बहुत समय बिताते हैं, CPython bytecode की व्याख्या करते हुए, कि GIL एक अड़चन बन जाता है।

कई कारणों से ठीक-ठाक ताला लगाने के विरोध में अजगर के पास एक GIL है:

  • यह एकल-थ्रेडेड मामले में तेज है।

  • यह आई / ओ बाध्य कार्यक्रमों के लिए बहु-थ्रेडेड मामले में तेज है।

  • यह सीपीयू-बाउंड कार्यक्रमों के लिए बहु-थ्रेडेड मामले में तेज है जो सी पुस्तकालयों में अपने कम्प्यूट-गहन काम करते हैं।

  • यह सी एक्सटेंशन को लिखना आसान बनाता है: जहां आप इसे होने देते हैं (यानी Py_BEGIN_ALLOW_THREADS और Py_END_ALLOW_THREADS मैक्रोज़ के बीच) को छोड़कर, पायथन थ्रेड्स का कोई स्विच नहीं होगा।

  • यह C पुस्तकालयों को लपेटना आसान बनाता है। आपको थ्रेड-सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है। यदि लाइब्रेरी थ्रेड-सुरक्षित नहीं है, तो आप कॉल करते समय बस GIL को बंद रखते हैं।

GIL को C एक्सटेंशन द्वारा जारी किया जा सकता है। पायथन की मानक लाइब्रेरी प्रत्येक अवरोधक i / o कॉल के आसपास GIL जारी करती है। इस प्रकार GIL का i / o बाउंड सर्वर के प्रदर्शन के लिए कोई परिणाम नहीं है। आप इस प्रकार प्रक्रियाओं (कांटा), धागे या अतुल्यकालिक i / o का उपयोग करके पायथन में नेटवर्किंग सर्वर बना सकते हैं, और GIL आपके रास्ते में नहीं आएगा।

सी या फोरट्रान में संख्यात्मक पुस्तकालयों को इसी तरह जारी किए गए जीआईएल के साथ बुलाया जा सकता है। जबकि आपका सी एक्सटेंशन FFT के पूरा होने की प्रतीक्षा कर रहा है, दुभाषिया अन्य पायथन थ्रेड को निष्पादित करेगा। इस प्रकार एक जीआईएल इस मामले में ठीक-ठीक लॉकिंग की तुलना में आसान और तेज़ है। यह संख्यात्मक कार्य के थोक का गठन करता है। NumPy एक्सटेंशन जब भी संभव हो GIL जारी करता है।

थ्रेड आमतौर पर ज्यादातर सर्वर प्रोग्राम लिखने का एक बुरा तरीका है। यदि लोड कम है, तो फोर्किंग आसान है। यदि भार अधिक है, तो एसिंक्रोनस i / o और ईवेंट-चालित प्रोग्रामिंग (जैसे पायथन ट्विस्टेड फ्रेमवर्क का उपयोग करना) बेहतर है। धागे का उपयोग करने का एकमात्र बहाना विंडोज पर os.fork की कमी है।

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

जीआईएल की परवाह किए बिना जीयूआई की प्रतिक्रिया बनाए रखने के लिए थ्रेड्स का उपयोग किया जा सकता है। यदि जीआईएल आपके प्रदर्शन को प्रभावित करता है (ऊपर की चर्चा), तो आप अपने धागे को एक प्रक्रिया दे सकते हैं और इसके खत्म होने का इंतजार कर सकते हैं।


52
मेरे लिए खट्टे अंगूर की तरह लगता है। पायथन धागे को ठीक से नहीं कर सकता है, इसलिए आप कारण बनाते हैं कि धागे अनावश्यक या खराब भी क्यों हैं। "अगर लोड कम है, तो फोर्किंग आसान है", गंभीरता से? और जीआईएल उन सभी मामलों के लिए "तेज" है, जब आप रेफरेंस-काउंटिंग जीसी का उपयोग करने पर जोर देते हैं।
माइकल बोर्गवर्ड

9
s/RPython/PyPy/g। @MichaelBorgwardt प्रो जीआईएल के कारण प्रश्न के बिंदु की तरह है, है ना? हालाँकि मैं इस बात से सहमत हूँ कि इस उत्तर की कुछ सामग्री (विकल्प की चर्चा) बिंदु के बगल में है। और बेहतर या बदतर के लिए, अब से छुटकारा पाना लगभग असंभव है - यह पूरे एपीआई और कोड बेस में गहराई से जुड़ा हुआ है; आधे कोड को फिर से लिखना और सभी बाहरी कोड को तोड़ने के बिना इससे छुटकारा पाना लगभग असंभव है ।

10
multiprocessing2.6 के बाद से पुस्तकालय - मानक मत भूलना । यह श्रमिक पूल कुछ सरल प्रकार के समानता के लिए एक सुपर-स्लिक अमूर्तता है।
शॉन मैकसमोरेटिंग

8
@alcalde केवल अगर आप नहीं जानते कि आप क्या कर रहे हैं और / या आप नहीं चाहते कि आपके सूत्र सहकारी / संचार कार्य करने में सक्षम हों। अन्यथा, यह पीठ में एक शाही दर्द है, विशेष रूप से कुछ ओएस पर एक नई प्रक्रिया शुरू करने के ओवरहेड को देखते हुए। हमारे पास 32 कोर वाले सर्वर हैं, इसलिए CPython में उन्हें पूरी तरह से उपयोग करने के लिए मुझे 32 प्रक्रियाओं की आवश्यकता होगी। यह एक "अच्छा समाधान" नहीं है यह CPython की अपर्याप्तता के आसपास काम करने के लिए एक हैक है।
बेसिक

8
तथ्य यह है कि विंडोज के अलावा प्लेटफार्मों पर मौजूद थ्रेड्स पर्याप्त सबूत होने चाहिए कि फोर्किंग हर स्थिति में पर्याप्त नहीं है।
zneak

42

सबसे पहले: पायथन में एक GIL नहीं है। पायथन एक प्रोग्रामिंग भाषा है। एक प्रोग्रामिंग भाषा अमूर्त गणितीय नियमों और प्रतिबंधों का एक सेट है। पायथन लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ भी नहीं है जो कहता है कि एक GIL होना चाहिए।

पायथन के कई अलग-अलग कार्यान्वयन हैं। कुछ में GIL है, कुछ में नहीं।

GIL होने के लिए एक सरल व्याख्या यह है कि समवर्ती कोड लिखना कठिन है। अपने कोड के चारों ओर एक विशालकाय ताला लगाकर, आप इसे हमेशा क्रमिक रूप से चलाने के लिए बाध्य करते हैं। समस्या सुलझ गयी!

सीपीथॉन में, विशेष रूप से, एक महत्वपूर्ण लक्ष्य सी में लिखे गए प्लगइन्स के साथ दुभाषिया का विस्तार करना आसान बनाना है। फिर से, समवर्ती कोड लिखना कठिन है, इसलिए यह गारंटी देते हुए कि कोई संगामिति नहीं होगी, इसके लिए एक्सटेंशन लिखना आसान है दुभाषी। इसके अलावा, उन एक्सटेंशनों में से कई मौजूदा पुस्तकालयों के चारों ओर सिर्फ पतले रैपर हैं, जो शायद मन में संगामिति के साथ नहीं लिखे गए हैं।


6
यही तर्क जावा के अहस्ताक्षरित संख्यात्मक प्रकारों की कमी के रूप में है - डेवलपर्स को लगता है कि बाकी सभी उनके मुकाबले कमज़ोर हैं ...
बेसिक

1
@Basic - विश्वास करें या न करें, यहां तक ​​कि जब आप वास्तव में नहीं हैं, तो वास्तव में गूंगा, यह पता चला है कि एक ऐसी भाषा है जो सरल धारणाएं बनाती है, जिसका अर्थ है कि आप उन्हें काम करने के लिए कुछ चीजों के बारे में नहीं सोचते हैं, यह अभी भी उपयोगी है चीज़। सीपीथॉन कुछ चीजों के लिए बहुत अच्छा है, जिसमें सरल मल्टीथ्रेडेड एप्लिकेशन (जहां प्रोग्राम IO बाउंड है, जो कई हैं, और इसलिए GIL कोई फर्क नहीं पड़ता) सहित, क्योंकि जीआईएल ने सबसे अच्छा समाधान किया डिजाइन निर्णय भी उन अनुप्रयोगों को प्रोग्रामिंग को आसान बनाते हैं। , विशेष रूप से तथ्य यह है कि यह संग्रह पर परमाणु संचालन का समर्थन करता है ।
जूल्स

@ जूल्स हाँ, यह बहुत आसान है जब तक आप उन क्षमताओं की जरूरत है। cpython का "पसंदीदा" समाधान "बस इसे किसी अन्य भाषा में c ++ की तरह लिखें" तो इसका मतलब है कि आप हर एक प्रकार का अजगर लाभ खो देते हैं। यदि आप c ++ में अपना आधा कोड लिख रहे हैं, तो पायथन से क्यों शुरू करें? ज़रूर, छोटे एपीआई / गोंद परियोजनाओं के लिए यह त्वरित और आसान है, और ईटीएल के लिए यह किसी से पीछे नहीं है, लेकिन यह किसी भी चीज़ के लिए उपयुक्त नहीं है जिसके लिए भारी उठाने की आवश्यकता होती है। हार्डवेयर के साथ बात करने के लिए जावा का उपयोग करने के समान ... यह लगभग हास्यपूर्ण है जो आपको कूदना है।
बेसिक

16

GIL का उद्देश्य क्या है?

CAPI प्रलेखन में इस विषय पर यह कहना है:

पायथन दुभाषिया पूरी तरह से थ्रेड-सुरक्षित नहीं है। बहु-थ्रेडेड पायथन कार्यक्रमों का समर्थन करने के लिए, वैश्विक इंटरप्रेटर लॉक या जीआईएल नामक एक वैश्विक लॉक है, जिसे पायथन ऑब्जेक्ट्स को सुरक्षित रूप से एक्सेस करने से पहले वर्तमान थ्रेड द्वारा आयोजित किया जाना चाहिए। लॉक के बिना, यहां तक ​​कि सबसे सरल संचालन भी एक बहु-थ्रेडेड प्रोग्राम में समस्याएं पैदा कर सकता है: उदाहरण के लिए, जब दो धागे एक साथ एक ही वस्तु के संदर्भ गणना में वृद्धि करते हैं, तो संदर्भ गणना दो बार के बजाय केवल एक बार बढ़ाई जा सकती है।

दूसरे शब्दों में, GIL राज्य के भ्रष्टाचार को रोकता है। पायथन कार्यक्रमों को कभी भी विभाजन की गलती नहीं करनी चाहिए, क्योंकि केवल मेमोरी सुरक्षित संचालन की अनुमति है। जीआईएल इस आश्वासन को बहु-सूत्रित कार्यक्रमों तक बढ़ाता है।

विकल्प क्या हैं?

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


2
यह अच्छा होगा कि उपयोगकर्ता एक प्रोग्राम को दुभाषिया लॉक के लिए गिल की जगह एक दुभाषिया विकल्प के साथ चलाए, और किसी भी तरह से जान-बूझकर-चाहे वर्तमान प्रक्रिया को गिल के साथ या बिना उठाया गया था।
लुइस मासुइली

जीआईएल के बावजूद, मैं मॉड्यूल पैयोडबैक के लापरवाह उपयोग के कारण एक मल्टीथ्रेडेड प्रोग्राम में एक विभाजन दोष पैदा करने में कामयाब रहा। इस प्रकार "एक विभाजन दोष उत्पन्न नहीं करना चाहिए" एक गिरावट है।
मुपोसत '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.