2014-05-13 12 views
11

मैं अजगर अनुरोध उपयोग कर रहा हूँ पुस्तकालय सत्र के साथ:अनुरोध पुस्तकालय में, मैं "HttpConnectionPool पूर्ण है, कनेक्शन को छोड़कर" चेतावनी से कैसे बच सकता हूं?

def _get_session(self): 
    if not self.session: 
     self.session = requests.Session() 
    return self.session 

और कभी-कभी मैं अपने लॉग में इस चेतावनी हो रही है:

[2014/May/12 14:40:04 WARNING ] HttpConnectionPool is full, discarding connection: www.ebi.ac.uk 

मेरा प्रश्न है: चेतावनी क्यों यह जाता है और नहीं एक अपवाद ?

इस कोड को इस (http://pydoc.net/Python/requests/0.8.5/requests.packages.urllib3.connectionpool/ से) के लिए जिम्मेदार है:

def _put_conn(self, conn): 
    try: 
     self.pool.put(conn, block=False) 
    except Full: 
     # This should never happen if self.block == True 
     log.warning("HttpConnectionPool is full, discarding connection: %s" 
        % self.host) 

क्यों इस अपवाद यहाँ catched है? यदि इसका पुन: उपयोग किया गया था, तो मैं नया सत्र बनाकर और पुराने को हटाकर, इस कोड को अपने कोड में संभाल सकता हूं।

यदि यह केवल एक चेतावनी है, तो इसका मतलब यह है कि यह मेरे परिणामों को किसी भी तरह से प्रभावित नहीं करता है? क्या मैं इसे अनदेखा कर सकता हूं? यदि नहीं, तो मैं इस स्थिति को कैसे संभाल सकता हूं?

+1

क्या आपने 'self.block' को' True' पर सेट करने का प्रयास किया था? – roippi

+1

क्या मैं वास्तव में अपने अनुरोधों को अवरुद्ध करना चाहता हूं? शायद यह चेतावनी गायब हो जाएगी लेकिन क्या कोई अन्य परिणाम हैं? कुछ कारण यह डिफ़ॉल्ट रूप से सही नहीं है, है ना? – mnowotka

+0

': param block: यदि सही पर सेट किया गया है, तो ** अधिकतम ** ** ** कनेक्शन का उपयोग एक समय में नहीं किया जाएगा। जब कोई मुफ्त कनेक्शन उपलब्ध नहीं होता है, तो कॉल तब तक अवरुद्ध हो जाएगा जब तक कोई कनेक्शन जारी नहीं किया जाता है। – roippi

उत्तर

6

अनुरोध डॉक्स से http://docs.python-requests.org/en/latest/api/ में

class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False) 

निर्मित urllib3 के लिए HTTP एडाप्टर।

परिवहन एडाप्टर इंटरफ़ेस को कार्यान्वित करके HTTP और HTTPS urls से संपर्क करने के लिए अनुरोध सत्रों के लिए सामान्य केस इंटरफ़ेस प्रदान करता है। इस कक्षा को आम तौर पर कवर के तहत सत्र वर्ग द्वारा बनाया जाएगा।

पैरामीटर:

  • pool_connections - कैश करने के लिए urllib3 कनेक्शन पूल की संख्या।
  • pool_maxsize - पूल में सहेजने के लिए कनेक्शन की अधिकतम संख्या।
  • max_retries (int) - प्रत्येक कनेक्शन को पुनः प्रयास करने की अधिकतम संख्या का प्रयास करना चाहिए। नोट, यह केवल असफल कनेक्शन और टाइमआउट पर लागू होता है, अनुरोध नहीं करता कि सर्वर प्रतिक्रिया देता है।
  • पूल_ब्लॉक - क्या कनेक्शन पूल कनेक्शन के लिए अवरुद्ध होना चाहिए।

और नीचे एक छोटे से, एक उदाहरण

import requests 
s = requests.Session() 
a = requests.adapters.HTTPAdapter(max_retries=3) 
s.mount('http://', a) 

आता है इस

a = requests.adapters.HTTPAdapter(pool_connections = N, pool_maxsize = M) 

कहाँ एन और एम अपने कार्यक्रम के लिए उपयुक्त हैं की कोशिश करो।

+0

मेरे मामले में, एम के लिए आदर्श मान अनंत है :) यदि मैं एम के किसी भी विशिष्ट मान का उपयोग करता हूं, तो मुझे यह समझने की आवश्यकता है कि इस सत्र में कितने अनुरोध किए गए थे और फिर इसे छोड़ दें, है ना? – mnowotka

+0

क्या आप समांतर या अनुक्रम में कनेक्शन फायर कर रहे हैं? करीबी() स्पष्ट रूप से प्रतिक्रिया वस्तुओं के बारे में कैसे? – andmart

+0

केवल समानांतर में। – mnowotka

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

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