在Google App Engine中使用urllib2会导致“等待来自URL的HTTP响应时超出截止日期:...”

时间:2014-09-23 07:43:18

标签: python google-app-engine urllib2 urlfetch

我在python中使用urllib2用于Google App Engine(GAE)。 由于以下错误,应用程序经常崩溃:

  

等待来自URL的HTTP响应时超过了截止日期:....

Source看起来像这样:

import webapp2
import urllib2
from bs4 import BeautifulSoup

def functionRunning2To5Seconds_1()    
    #Check if the Url could be parsed
    try:
        url         ="http://...someUrl..."
        req         = urllib2.Request(url,headers={'User-Agent': 'Mozilla/5.0'})
        page        = urllib2.urlopen(req)
        htmlSource  = BeautifulSoup(page)
    except Exception  e:
        logging.info("Error : {er}".format(er=str(e)))

    #do some calculation with the data of htmlSource, which takes 2 To 5 Seconds

#and the handler looks like:
class xyHandler(webapp2.RequestHandler):
    def post(self, uurl=None):
        r_data1 = functionRunning2To5Seconds_1()
        r_data2 = functionRunning2To5Seconds_2()
        r_data3 = functionRunning2To5Seconds_3()
        ...
        #show the results in a web page

我发现这个doc表明:

  

您可以使用Python标准库urllib,urllib2或httplib   发出HTTP请求。在App Engine中运行时,这些库   使用App Engine的URL提取服务

执行HTTP请求

和此:

  

您可以为请求设置截止日期,最长时间   服务将等待回应。默认情况下,获取的截止日期   是5秒。 HTTP请求的最长截止时间为60秒   任务队列和cron作业请求的时间为60秒。

那我该怎么做?如何在urllib2上设置超时?

或者,我是否必须重写整个应用程序以使用App Engine的URL提取服务?

(PS:有没有人知道一种安全的方式来并行运行“r_data1 = functionRunning2To5Seconds _...()”调用?)

2 个答案:

答案 0 :(得分:5)

https://docs.python.org/2/library/urllib2.html

urllib2.urlopen(url[, data][, timeout])
  

可选的timeout参数指定超时(以秒为单位)   阻塞操作,如连接尝试(如果未指定,则   将使用全局默认超时设置。)

答案 1 :(得分:2)

根据Paul的建议,您可以传递timeout参数。在App Engine上,它与URL提取相关联,并将其截止日期调整为最多60秒。请记住,如果urlopen的时间超过了timeout参数中指定的时间,那么您将获得来自google.appengine.api.urlfetch_errors.DeadlineExceededError而不是通常的socket.timeout的DeadlineExceededError。捕获此错误并在必要时重试/记录是一种很好的做法。有关处理DeadlineExceededError的更多信息,请参见[1]。

[1] - https://developers.google.com/appengine/articles/deadlineexceedederrors