如何在Google App Engine中为urlfetch设置超时时间?

19

我正在尝试让Django(在GAE上运行)从另一个Web服务中获取数据。经常遇到这样的错误:

ApplicationError:2超时请求

方法:GET

请求URL:http://localhost:8080/

异常类型:DownloadError

异常值:ApplicationError:2超时

异常位置:/google_appengine/google/appengine/api/urlfetch.py中的_get_fetch_result,第325行

感觉只有12秒后才会超时(不确定,但时间确实很短)。

问题:如何设置更长的超时时间?

4个回答

27

鉴于这是一个关于Python的问题,我想为任何遇到此问题的人提供一个Python答案。

只需导入urlfetch,然后在您的代码中做任何其他事情之前定义一个截止时间:

from google.appengine.api import urlfetch

urlfetch.set_default_fetch_deadline(60)

添加于版本1.5.3 - Michael Allan Jackson

24
您可以使用fetch函数deadline参数进行设置。根据文档:

请求处理程序的截止时间最长可达60秒,任务队列和cron job处理程序为10分钟。如果未设置截止时间,则截止时间将设为5秒。


编辑:看起来现在已经改变了。来自这里

您可以为请求设置截止时间,即服务等待响应的最长时间。默认情况下,抓取的截止时间为5秒。您可以使用urlfetch.set_default_fetch_deadline()函数调整请求的默认截止时间。

此页面列出了默认超时值:

目前,Python运行环境存在几个名为DeadlineExceededError的错误:

  • google.appengine.runtime.DeadlineExceededError:如果总体请求超时,则引发异常,通常在60秒后或任务队列请求中为10分钟。
  • google.appengine.runtime.apiproxy_errors.DeadlineExceededError:如果RPC超出其截止时间,则引发异常。默认情况下为5秒,但某些API可以使用“截止时间”选项进行设置。
  • google.appengine.api.urlfetch_errors.DeadlineExceededError:如果URLFetch超时,则引发异常。

好的,我想知道为什么您决定使用Java来回答问题,当OP明确表示他正在使用Django时?您没有提供Python等效代码 :( - kassold
两年后,有人编辑了我的答案,并添加了一个Java代码片段...如果您查看第一行中的超链接,它们链接到Python文档。无论如何,在Alex Young的答案中都提供了一个Python示例。 - Mark Bell
您链接的文档中不再包含任何关于最长60秒的限制的提及。这个限制已经被弃用了吗? - conradlee

7

对于Go语言,您可以尝试以下代码:

// createClient is urlfetch.Client with Deadline
func createClient(context appengine.Context, t time.Duration) *http.Client {
    return &http.Client{
        Transport: &urlfetch.Transport{
            Context:  context,
            Deadline: t,
        },
    }
}

这是如何使用它的方法。
// urlfetch
client := createClient(c, time.Second*60)

我知道这条评论是来自2013年的,但API已经改变了,urlfetch,Transport不再有Deadline字段。要设置截止时间,请在上下文中设置它,使用:ctx,_:= context.WithDeadline(context,time.Second * 60)。这种方法的问题是您还限制了所有后续请求可用的时间。我的意思是,如果您在任务中轮询bigquery(具有10分钟超时),并将截止时间设置为60秒,则实际上将轮询期限限制为60秒,因为截止时间设置在传递给BigQuery的客户端上设置的上下文中。 - gabrielf

-2

看起来很短,但你必须知道GAE上的请求超时时间大约为30秒。由于您可能需要对urlfetch的响应执行一些操作,因此我认为没有必要设置超时时间超过10秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接