2012-01-26 7 views
5

सी/सी ++ भाषाओं की तरह, ज़ीरोम सॉकेट बंद करना स्पष्ट रूप से एक जरूरी है, जिसे मैं समझता हूं। लेकिन कुछ उच्च स्तर की भाषाओं में, जैसे php और पायथन, जिसमें कचरा संग्रहण तंत्र है, क्या मुझे सॉकेट को स्पष्ट रूप से बंद करने की आवश्यकता है?क्या मुझे ज़ीरोम सॉकेट को पायथन में स्पष्ट रूप से बंद करना चाहिए?

PHP में, कोई ZMQSocket :: close() और पायथन में नहीं है, pyzmq के दस्तावेज़ कहते हैं कि socket.close() को छोड़ा जा सकता है क्योंकि यह कचरा संग्रह के दौरान स्वचालित रूप से बंद हो जाएगा।

तो मेरे सवाल है,

उत्तर

2

जब आप उनके साथ काम करते हैं तो किसी भी I/O संसाधन को बंद करना हमेशा सही होता है। कचरा कलेक्टर अंततः उन्हें बंद कर देगा। आखिरी संदर्भ दायरे से बाहर हो जाने पर यह तुरंत बंद हो सकता है। यह बंद हो सकता है क्योंकि आपका प्रोग्राम बाहर निकल रहा है। जब आप ऐसा करने की प्रतीक्षा करते हैं, तो संसाधन स्मृति को ले जाने, फ़ाइल पॉइंटर्स लेने और सामान्य रूप से आपके सिस्टम संसाधनों को खाने के लिए खुला रहता है। एक छोटे, अल्पकालिक कार्यक्रम के लिए यह एक बड़ा मुद्दा नहीं हो सकता है, लेकिन यदि आपका सॉफ़्टवेयर लंबे समय तक रहता है या बहुत सारे कनेक्शन स्थापित करता है, तो यह आपको वापस चोट पहुंचाने के लिए वापस आ जाएगा।

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

1

आप नहीं मैं मैन्युअल रूप से इसे बंद या नहीं? करने की आवश्यकता है ...। आप पाइथन में स्पष्ट रूप से चीजों को बंद या हटा सकते हैं जब:

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

आमतौर पर पाइथन में ऐसी चीजों के बारे में सोचने के लिए यह पैडेंटिक और समयपूर्व बात कर रहा है।

+0

दिलचस्प बात यह है कि मैं ऊपर से मिले दूसरे सेनारियो का सामना कर रहा हूं। एक डेमॉन प्रक्रिया में मैं एक zmq सॉकेट खोलूंगा और उस संदर्भ को तब तक रोकूंगा जब तक प्रक्रिया बंद नहीं हो जाती है, उदा। SIGTERM प्राप्त करें। उस पल में, क्या मुझे स्पष्ट रूप से सॉकेट.क्लोज़() को आमंत्रित करना चाहिए या जीसी को नौकरी करना चाहिए? –

+0

@ जेरी: उस मामले में बस प्रक्रिया को समाप्त कर दें। संसाधन ऑपरेटिंग सिस्टम द्वारा मुक्त किया जाएगा। जेडएमक्यू काम करेगा कि क्या है। इसके अतिरिक्त, जीसी आमतौर पर ऐसी परिस्थितियों में जितना संभव हो उतना साफ करने का प्रयास करेगा। –

1

इसे आपके द्वारा उपयोग किए जाने वाले संसाधनों को बंद करने के लिए अच्छी शैली माना जाता है।

आम तौर पर, कचरा संग्रह के दौरान चीजें बंद होती हैं। लेकिन यह एक कार्यान्वयन विस्तार है जब __del__() कहा जाता है। सीपीथॉन में, आपके पास संदर्भ गिनती है और जैसे ही उनका उपयोग नहीं किया जाता है, उतनी ही वस्तुओं को त्याग दिया जाता है। ज्योथन आदि के रूप में अन्य कार्यान्वयन अलग-अलग काम कर सकते हैं।

कार्यान्वयन कचरा संग्रहण को स्थगित या इसे पूरी तरह छोड़ करने की अनुमति दी है - यह कार्यान्वयन की गुणवत्ता की बात है कैसे कचरा संग्रहण कार्यान्वित किया जाता है, जब तक कि कोई वस्तुओं एकत्र कर रहे हैं कि अभी भी पहुंचा जा सकता है।

2.5 या 2.6 में, संदर्भ प्रबंधकों को इस तरह की समस्याओं का सामना करने के लिए पेश किया गया था। तब से, यह goot शैली इस तरह से फाइलों के साथ काम करने के लिए माना जाता है:

with open(...) as f: 
    # do stuff with file object f 
# now it is automatically closed. 

मैं zeromq पता नहीं है, लेकिन यह हो सकता है यह रूप में अच्छी तरह संदर्भ प्रबंधकों के लिए समर्थन किया है।

यदि मैं कमांड लाइन के माध्यम से एक-लाइनरिश काम करता हूं तो मैं व्यक्तिगत रूप से मैला हूं, लेकिन पूर्ण कार्यक्रमों में बल्कि सख्त होने लगता हूं। अंतर्निहित से स्पष्ट होना बेहतर है।

2

हालात बदल रहे हैं - समापन सॉकेट स्वचालित रूप से

वर्तमान प्रलेखन राज्यों नहीं किया, सॉकेट बंद करने (या Context.term() ना बुलाने की आवश्यक के रूप में यह कचरा संग्रहण के साथ स्वचालित रूप से किया जाता है, pyzmq changelog states, है

हालांकि उस संस्करण के बाद से। 14.3.0 यह नहीं सच के रूप में अजगर 3.4 में परिवर्तन समझदारी से इस तरह बात करने की अनुमति नहीं है मैं इस के लिए एक मुद्दा Update docstrings about context.term() and socket.close() with regards to garbage collection दायर की है मैं है।

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

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