如何在Google App Engine上使用urllib2声明超时?

时间:2010-07-26 20:45:38

标签: google-app-engine urllib2 feedparser urlfetch

我知道Google App Engine上有urllib2作为Urlfetch的包装,如您所知,Universal Feedparser使用urllib2。

你知道在urllib2上设置超时的方法吗?
urllib2上的timeout参数是否已移植到Google App Engine版本上?

我对以下方法不感兴趣:

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

4 个答案:

答案 0 :(得分:3)

没有简单的方法可以做到这一点,因为根据我的知识,包装器不提供传递超时值的方法。一个hackish选项是monkeypatch 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

答案 1 :(得分: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
    )

答案 2 :(得分:0)

您可以设置默认的截止日期,这是首选方式:

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


class MyClass():

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

我有一个开启者,我使用urllib2来启用CookieJar,但你可以只做简单的请求

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

如果您将截止日期设置为0.1

,则可以轻松查看效果

答案 3 :(得分:-3)

您是否尝试过设置套接字超时值?取自here

从Python 2.3开始,您可以指定套接字在超时之前应等待响应的时间。这在必须获取网页的应用程序中非常有用。默认情况下,套接字模块没有超时并且可以挂起。目前,套接字超时未在httplib或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   connections.connections。