2014-04-28 18 views
14

मैं अपने पायथन कार्यक्रम में अमेज़ॅन एस 3 से कनेक्ट करने के लिए बोटो का उपयोग कर रहा हूं। मैं एक कनेक्शन खोलने और एक बाल्टी में फाइल अपलोड करने में सक्षम हूँ। मैंने सोचा कि मुझे संसाधनों को रिहा करने के लिए कनेक्शन बंद करना चाहिए और अधिक महत्वपूर्ण है, किसी भी सुरक्षा जोखिम से बचने के लिए खुले कनेक्शन को लटकने से बचें। मैंने माना कि मुझे नज़दीकी() विधि को कॉल करना चाहिए। लेकिन मैंने निम्नानुसार इसका परीक्षण किया: 1. ओपन कनेक्शन। 2. कनेक्शन बंद करें। 3. बाल्टी में फ़ाइल अपलोड करें।बोटो एस 3 कनेक्शन कैसे बंद करें?

मैं लगा चरण 3 विफल हो जाएगा, लेकिन अपलोड काम किया! तो करीबी() क्या करता है? अगर यह कनेक्शन को वास्तव में बंद नहीं करता है, तो मुझे नज़दीक() के स्थान पर क्या उपयोग करना चाहिए? या कनेक्शन बंद करने के लिए यह सिर्फ अनावश्यक है?

मैं Boto tutorial में जवाब के लिए देखा है, Boto API reference, और this StackOverflow post, लेकिन कोई किस्मत अब तक।

आपकी मदद के लिए धन्यवाद।

उत्तर

6

आपका चरण 3 काम करता है क्योंकि बोटो में कोड है जो स्वचालित रूप से बंद कनेक्शन को फिर से खोल देगा और त्रुटियों पर अनुरोधों को पुनः प्रयास करेगा। बोटो कनेक्शन मैन्युअल रूप से बंद करके हासिल करने के लिए बहुत कम है क्योंकि वे केवल HTTP कनेक्शन हैं और निष्क्रिय समय के कुछ मिनट बाद स्वचालित रूप से बंद हो जाएंगे। मैं उन्हें बंद करने की कोशिश करने की चिंता नहीं करता।

2

कवर के तहत, Boto httplib उपयोग करता है। यह क्लाइंट लाइब्रेरी HTTP 1.1 Keep-Alive का समर्थन करती है, इसलिए यह सॉकेट को खोल सकता है और रखना चाहिए ताकि वह उसी कनेक्शन पर एकाधिक अनुरोध कर सके।

connection.close() वास्तव में अंतर्निहित सॉकेट को बंद नहीं करता है। इसके बजाए, यह प्रेजेंटप्लिब कनेक्शन के अंतर्निहित पूल के संदर्भ को हटा देता है, जो कचरा कलेक्टर को उन पर चलाने की अनुमति देता है, और जब वास्तविक सॉकेट बंद होता है।

जाहिर है, आप कचरा कलेक्टर को भी बोटो कनेक्शन के संदर्भ में नहीं रखकर चला सकते हैं। लेकिन बोटो कनेक्शन का पुन: उपयोग करने के लिए प्रदर्शन लाभ हैं (उदाहरण के लिए उपरोक्त Keep-Alive नोट देखें)।

सौभाग्य से, ज्यादातर मामलों में, आपको connection.close() स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है। एक मामले पर अधिक जानकारी के लिए जहां आपको बंद करना है, मेरा जवाब the StackOverflow post पर देखें जो प्रश्न में जुड़ा हुआ है।

0

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

boto3.client.sign_up(
       ClientId='xxxxxxxxxxxxxxxxxxxxxxxxxx', 
       Username=self._user['email'], 
       Password=self._user['password'], 
       UserAttributes=attributes 
) 
dbUserInstance.addUnverifiedEmail(self._user['email']) 

इस के परिणामस्वरूप (त्रुटि 1205 ताला प्रतीक्षा टाइमआउट को पार कर)। नीचे, addUserToCognito boto3 कनेक्शन बनाता है और यह सम्मिलित होने से पहले दायरे से बाहर आता है।

self.addUserToCognito() 
dbUserInstance.addUnverifiedEmail(self._user['email']) 

इस परिवर्तन के बाद सम्मिलन सफल हुआ। सौभाग्य से मेरे लिए, addUnverifiedEmail addUserToCognito के अंदर अंतिम फ़ंक्शन कॉल था, इसलिए इसे बाहर ले जाना आसान था। अन्य, अधिक जटिल, कोड में समान क्षमता नहीं हो सकती है। तो, client.close() वास्तव में कनेक्शन बंद नहीं कर रहा है और इसे बंद रखकर एक बहुत बड़ी दोष हो सकती है।

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