मैं अजगर करने के लिए नया हूँ और किसी और के पढ़ने कोड:क्या मुझे urllib.urlopen() के बाद नज़दीकी() कॉल करना चाहिए?
urllib.urlopen()
urllib.close()
द्वारा पालन किया जाना चाहिए? अन्यथा, कोई रिसाव कनेक्शन, सही होगा?
मैं अजगर करने के लिए नया हूँ और किसी और के पढ़ने कोड:क्या मुझे urllib.urlopen() के बाद नज़दीकी() कॉल करना चाहिए?
urllib.urlopen()
urllib.close()
द्वारा पालन किया जाना चाहिए? अन्यथा, कोई रिसाव कनेक्शन, सही होगा?
close
विधि परिणाम urllib.urlopen
की, नहीं urllib
मॉड्यूल में ही आप के बारे में सोच रहे हैं के रूप में पर पर बुलाया जाना चाहिए (जैसा कि आप urllib.close
उल्लेख - जो मौजूद नहीं है)।
: x = urllib.urlopen(u)
आदि, उपयोग के बजाय:
import contextlib
with contextlib.closing(urllib.urlopen(u)) as x:
...use x at will here...
with
बयान है, और closing
संदर्भ प्रबंधक, यहां तक कि अपवाद की उपस्थिति में उचित बंद सुनिश्चित करेगा।
कड़ाई से बोलते हुए, यह सच है। लेकिन व्यावहारिक रूप से, एक बार (अगर) urllib
गुंजाइश से बाहर हो जाता है, कनेक्शन स्वचालित कचरा कलेक्टर द्वारा बंद कर दिया जाएगा।
यह पायथन के कुछ कार्यान्वयन के लिए सच है, लेकिन पाइथन भाषा इस बात की गारंटी नहीं देती है कि जैसे ही ऑब्जेक्ट गुंजाइश हो जाता है, बंद हो जाएगा। सीएफ jython –
@gnibbler इस उत्तर के लेखक यह नहीं बताते हैं कि यह होगा * जैसे ही * यह होगा कि यह होगा। –
@ पियोटर, लेकिन शायद प्रोग्राम क्रैश हो जाए यदि मेरे पास लूप खोलने वाले यूआरएल हैं और जीसी पर्याप्त तेज़ नहीं कर रहा है। यह चीजों को करने के लिए एक बहुत ही बेवकूफ तरीका है और उत्पादन कोड में नहीं है। –
@ पीटर कहते हैं, आउट-ऑफ-स्कोप खोले गए यूआरएल कचरे के संग्रह के लिए पात्र बन जाएंगे।
हालांकि, यह भी ध्यान रखें कि urllib.py
परिभाषित करता है:
def __del__(self):
self.close()
इसका मतलब है कि जब कि उदाहरण के लिए संदर्भ गिनती शून्य, अपने __del__
विधि बुलाया जाएगा, और इस तरह अपनी close
पद्धति के रूप में बुलाया जाएगा तक पहुँच जाता है कुंआ। संदर्भ संख्या के लिए शून्य तक पहुंचने के लिए सबसे सामान्य "तरीका" उदाहरण को केवल दायरे से बाहर जाने देना है, लेकिन कुछ स्पष्ट रूप से आपको स्पष्ट del x
से कुछ भी नहीं रोक रहा है (हालांकि यह सीधे __del__
पर कॉल नहीं करता है बल्कि संदर्भ गणना को कम करता है एक - एक करके)।
यह निश्चित रूप से अच्छा शैली है स्पष्ट रूप से अपने संसाधनों को बंद करने के - लेकिन अजगर स्वचालित रूप से आप कुछ भी तरह हास्यास्पद नहीं करते है, तो आप के लिए साफ होगा - विशेष रूप से जब आपके आवेदन कहा संसाधनों का अत्यधिक उपयोग करने का खतरा बना ऐसे मामलों के संदर्भ (परिपत्र?) संदर्भ जिन्हें आपको अब और आवश्यकता नहीं है।
कचरा कलेक्टर को ओवरराउन करने के लिए यह संभव है - मेरे पास ऐसे मामले हैं जहां मैं फ़ाइल को हैंडल को तेज़ी से बंद कर रहा हूं [लेकिन जहां एक स्पष्ट 'जीसी।इकट्ठा करें() 'कॉल, या' क्लोज़() ', साफ चीजें ऊपर]। –
'data = urllib2.urlopen ('url') जैसे कुछ करने के बारे में क्या है। पढ़ें()' –
पायथन 3 में, कथन के लिए प्रत्यक्ष समर्थन जोड़ा गया था। urllib.urlopen (u) के साथ x: ... –