2011-01-20 15 views
6

मैं जीआईएल के बारे में पढ़ रहा था और यह वास्तव में कभी निर्दिष्ट नहीं है अगर इसमें मुख्य धागा शामिल है या नहीं (मुझे ऐसा लगता है)। कारण मैं पूछता हूं क्योंकि मेरे पास थ्रेड सेटअप के साथ एक प्रोग्राम है जो एक शब्दकोश को संशोधित करता है। मुख्य थ्रेड प्लेयर इनपुट के आधार पर जोड़ता/हटाता है जबकि थ्रेड डेटा अपडेट करने और डेटा बदलने के लिए लूप करता है।पायथन थ्रेडिंग और जीआईएल

हालांकि कुछ मामलों में एक धागा शब्दकोश कुंजी पर फिर से हो सकता है जहां कोई उन्हें हटा सकता है। यदि एक तथाकथित जीआईएल है और वे अनुक्रमिक रूप से चल रहे हैं, तो मुझे नियम क्यों बदल रहा है त्रुटियों को बदल दिया? अगर एक समय में केवल एक को चलाने का अनुमान है, तो तकनीकी रूप से ऐसा नहीं होना चाहिए।

क्या कोई इस तरह की चीज़ पर कुछ प्रकाश डाल सकता है? धन्यवाद।

+2

आम तौर पर, पायथन थ्रेडिंग केवल I/O-bound धागे के लिए समझ में आता है। यदि आप समानांतर में डेटा संरचनाओं तक पहुंचने की स्थिरता चाहते हैं, तो आपको स्पष्ट लॉकिंग की आवश्यकता है। यदि आपको सीपीयू-बाध्य समांतरता की आवश्यकता है, तो आमतौर पर आपको कुछ अलग-अलग उपयोग करना होगा। पाइथन शब्दकोष पृष्ठ से – 9000

उत्तर

4

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

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

+0

'जीआईएल सीपीथॉन दुभाषिया द्वारा उपयोग की जाने वाली तंत्र को आश्वस्त करने के लिए कि केवल एक थ्रेड एक समय में पायथन बाइटकोड निष्पादित करता है। यह ऑब्जेक्ट मॉडल (जैसे कि अंतर्निहित अंतर्निर्मित प्रकारों सहित) को समेकित पहुंच के खिलाफ पूरी तरह से सुरक्षित बनाकर सीपीथन कार्यान्वयन को सरल बनाता है। 'यदि मैं गलत नहीं हूं, तो इसका मतलब है कि थ्रेड सुरक्षित है? – boh

+1

यह आपके द्वारा किए गए कार्यों पर निर्भर करता है। यह थ्रेड-सुरक्षित नहीं है: 'डी [के] + = 1'। संदेह में, अपने स्वयं के सिंक्रनाइज़ेशन का उपयोग करें। –

10

वे एक ही समय में चल रहे हैं, वे तो बस एक ही समय में निष्पादित नहीं है। पुनरावृत्तियों को अंतःस्थापित किया जा सकता है। उद्धरण पायथन:

तंत्र CPython दुभाषिया के द्वारा प्रयोग किया आश्वस्त करने के लिए है कि केवल एक धागा कार्यान्वित अजगर बाईटकोड एक समय में।

तो दो for छोरों एक ही समय में चला सकता है, वहाँ बस कोई (उदाहरण के लिए) दो del dict[index] 'एक ही समय में रों हो जाएगा।

+0

आह धन्यवाद, यह मुझे समझ में आता है। – Charles

+1

फिर आपको जवाब स्वीकार किए जाने के रूप में चिह्नित करना चाहिए :) –

3

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

1

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

आपको अपने प्रोग्राम के परमाणु संचालन को अलग करने के लिए threading लाइब्रेरी से लॉक ऑब्जेक्ट का उपयोग करना चाहिए।

संबंधित मुद्दे