मैं "चेतावनियां" आज thread
मॉड्यूल के लिए प्रलेखन के खंड में दिलचस्प बयान में आए:क्या कोई अंतर्निहित कार्य है जो I/O पर अवरुद्ध करता है जो अन्य धागे को चलाने की अनुमति नहीं देता है?
नहीं सभी बिल्ट-इन कार्य है कि मैं के लिए इंतज़ार कर ब्लॉक कर सकते हैं/ओ अन्य धागे को चलाने के लिए अनुमति देते हैं। (सबसे लोकप्रिय लोगों (
time.sleep()
,file.read()
,select.select()
) अपेक्षित तरीके से।)
इसके अलावा सभी जगह मैंने आज तक देखा अजगर धागे पर चर्चा की, वहाँ हमेशा एक धारणा यह रही है कि सभी में निर्मित कार्य करता है जो क्या I/O जीआईएल जारी करेगा, जिसका मतलब है कि फंक्शन ब्लॉक के दौरान अन्य धागे चल सकते हैं। जहां तक मुझे पता था, अन्य धागे को अवरुद्ध करने वाले I/O ऑपरेशन का एकमात्र जोखिम यह होगा कि यह एक बग्गी सी-एक्सटेंशन में किया जा रहा था जो जीआईएल को रिहा करने के लिए उपेक्षित था।
तो, क्या यह कथन thread
दस्तावेज़ों से वास्तव में सच है? क्या कोई अंतर्निहित, अवरुद्ध I/O संचालन है जो जीआईएल जारी नहीं करता है? मैं अब तक कोई विशिष्ट उदाहरण नहीं ढूंढ पाया है।
शायद यह कार्यान्वयन विशिष्ट है। हो सकता है कि सीपीथॉन में कोई गैर-जीआईएल-रिलीजिंग I/O फ़ंक्शंस न हो, लेकिन अन्य संस्करणों को उन्हें रखने की अनुमति है, जब तक नींद/पढ़/चयन जीआईएल रिलीज़ रहे। – Kevin
हाँ मुझे विश्वास है कि @ केविन सही है। इसका मतलब यह है कि एक्सटेंशन के डेवलपर्स को जीआईएल जारी करने की आवश्यकता नहीं है, ऐसा करने के लिए विस्तार के अंदर यह सिर्फ अच्छा अभ्यास है। डेवलपर को पता होना चाहिए कि उनका कार्य पूरी तरह से I/O पर इंतजार कर रहा है और जीआईएल को एक विशिष्ट तरीके से प्रोग्राम करता है। इस प्रकार, इसकी गारंटी नहीं है। – beiller
@beiller दस्तावेज़ विशेष रूप से "अंतर्निहित फ़ंक्शंस" कहता है, हालांकि, जो मुझे बताता है कि यह यहां सी-एक्सटेंशन में फैक्टरिंग नहीं कर रहा है। – dano