2010-07-26 8 views
5

मुझे पता है कि urllib2 Google App Engine पर Urlfetch के रैपर के रूप में उपलब्ध है और, जैसा कि आप जानते हैं, यूनिवर्सल फीडपार्सर urllib2 का उपयोग करता है।Google App Engine पर urllib2 का उपयोग करके टाइमआउट कैसे घोषित करें?

क्या आप urllib2 पर टाइमआउट सेट करने के लिए कोई तरीका जानते हैं?
क्या Google App Engine संस्करण पर urllib2 पर timeout पैरामीटर पोर्ट किया गया है?

rssurldata = urlfetch(rssurl, deadline=..) 
feedparser.parse(rssurldata) 
+0

लिए समय सीमा तय की है वहाँ एक विशिष्ट कारण है कि आप सरल विधि का उपयोग नहीं करना चाहते हैं जिसे आपने अभी रेखांकित किया है? –

+0

@ निक हाय :)! उहम, सिर्फ इसलिए कि फ़ीड क्रॉलिंग लाइब्रेरी के साथ मैं काम कर रहा हूं, थोड़ी सी मुहरबंद है और जीए अज्ञेयवादी रहना चाहिए। क्या आप मुझे gae स्रोत कोड पर urllib2 wrapper पर इंगित कर सकते हैं? मुझे यह भी नहीं पता कि वर्तमान urllib2 टाइमआउट 5 सेकंड पर सेट किया गया है या अधिकतम 10 सेकंड (MAX Urlfetch Deadline) – systempuntoout

+0

रैपर टाइमआउट को 5 सेकंड के डिफ़ॉल्ट पर छोड़ देता है।मैं urlfetch एपीआई में रैपर के माध्यम से टाइमआउट मान पास करने के किसी भी तरीके से अवगत नहीं हूं। चीजों के हैकिश अंत पर, हालांकि, आप हमेशा 10 सेकंड तक डिफ़ॉल्ट रूप से urlfetch API को बंद कर सकते हैं ... –

उत्तर

3

ऐसा करने का कोई आसान तरीका नहीं है, क्योंकि रैपर टाइमआउट मान से गुजरने का कोई तरीका नहीं प्रदान करता है, जो मेरे ज्ञान के सर्वोत्तम है। एक हैशिश विकल्प urlfetch API को बंदरगाह करना होगा:

old_fetch = urlfetch.fetch 
def new_fetch(url, payload=None, method=GET, headers={}, 
      allow_truncated=False, follow_redirects=True, 
      deadline=10.0, *args, **kwargs): 
    return old_fetch(url, payload, method, headers, allow_truncated, 
        follow_redirects, deadline, *args, **kwargs) 
urlfetch.fetch = new_fetch 
+0

यह पैच करने के लिए सही जगह कहां है? क्रॉलिंग लाइब्रेरी को कॉल करने से पहले मुख्य या सीधे पर? – systempuntoout

+0

एपीआई का उपयोग करने से पहले आयात किए जाने वाले किसी भी मॉड्यूल में शीर्ष-स्तर। –

+0

एक आकर्षण की तरह काम किया, धन्यवाद। – systempuntoout

-3

आप सॉकेट टाइमआउट मान स्थापित करने की कोशिश की है:

मैं की तरह विधि में कोई दिलचस्पी नहीं है? here से लिया गया:

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

import socket 
import urllib2 

# timeout in seconds 
timeout = 10 
socket.setdefaulttimeout(timeout) 

# this call to urllib2.urlopen now uses the default timeout 
# we have set in the socket module 
req = urllib2.Request('http://www.voidspace.org.uk') 
response = urllib2.urlopen(req) 

मुझे यकीन है कि नहीं कर रहा हूँ अगर GAE यह मान पढ़ता है, लेकिन यह एक शॉट के लायक है!

संपादित करें:

urllib2 समय समाप्त पैरामीटर पारित करने की क्षमता है:

वैकल्पिक टाइमआउट अगर निर्दिष्ट नहीं किया पैरामीटर कनेक्शन का प्रयास की तरह अवरुद्ध कार्यों के लिए सेकंड में एक समय समाप्ति निर्दिष्ट करता है (, वैश्विक डिफ़ॉल्ट टाइमआउट सेटिंग का उपयोग किया जाएगा)। यह वास्तव में केवल HTTP, HTTPS, FTP और FTPS कनेक्शन। कनेक्शन के लिए काम करता है।

+0

हाँ, यह मेरी पहली कोशिश थी। सॉकेट ने gae पर setdefaulttimeout विधि नहीं निर्धारित की है :) हालांकि आपके समय के लिए धन्यवाद। – systempuntoout

+0

urllib2 के टाइमआउट पैरामीटर के बारे में क्या? – advait

+0

मैं पूछ रहा हूं "क्या Google App Engine संस्करण पर urllib2 पर टाइमआउट पैरामीटर पोर्ट किया गया है?"। – systempuntoout

1

मुझे यह पसंद है। यह GAE API अपडेट के लिए अधिक गतिशील है।

# -*- coding: utf-8 -*- 
from google.appengine.api import urlfetch 

import settings 


def fetch(*args, **kwargs): 
    """ 
    Base fetch func with default deadline settings 
    """ 
    fetch_kwargs = { 
     'deadline': settings.URL_FETCH_DEADLINE 
    } 
    fetch_kwargs.update(kwargs) 
    return urlfetch.fetch(
     *args, **fetch_kwargs 
    ) 
0

आप डिफ़ॉल्ट समय सीमा जो पसंदीदा तरीका है सेट कर सकते हैं:

from google.appengine.api import urlfetch 
import urllib, urllib2 


class MyClass(): 

    def __init__(self): 
     urlfetch.set_default_fetch_deadline(10) 

मैं एक सलामी बल्लेबाज मैं CookieJar को सक्षम करने के लिए urllib2 का उपयोग किया है, लेकिन आप तो बस सरल अनुरोध कर सकते हैं

response = self.opener.open(self.url_login, data_encoded) 

आप आसानी से प्रभाव देख सकते हैं अगर आप 0.1