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

19 投票
4 回答
14613 浏览
提问于 2025-04-15 18:38

我正在尝试让Django(在Google App Engine上)从另一个网络服务获取数据。经常会遇到这样的错误:

应用错误:请求超时 2

方法:GET

请求网址:http://localhost:8080/

异常类型:下载错误

异常信息:应用错误:超时 2

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

感觉好像超时只会在12秒后发生(我不太确定,但确实很短)。

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

4 个回答

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)
27

因为这是一个关于Python的问题,所以我想给遇到这个问题的人提供一个Python的解决办法。

只需要导入urlfetch,然后在代码中定义一个截止时间,接下来就可以进行其他操作了:

from google.appengine.api import urlfetch

urlfetch.set_default_fetch_deadline(60)
24

你可以通过 deadline 参数来设置请求的时间限制,这个参数是在 fetch 函数中使用的。根据 文档的说明:

请求处理的时间限制最多可以设置为60秒,而任务队列和定时任务的时间限制可以设置为10分钟。如果没有设置时间限制,默认的时间限制是5秒。


编辑: 看起来这个规则现在有了变化。从 这里可以看到:

你可以为请求设置一个时间限制,也就是服务等待响应的最长时间。默认情况下,fetch 的时间限制是5秒。你可以使用 urlfetch.set_default_fetch_deadline() 函数来调整请求的默认时间限制。

还有 这个页面列出了默认的超时值:

目前,Python 运行时有几种错误叫做 DeadlineExceededError:

  • google.appengine.runtime.DeadlineExceededError: 如果整体请求超时,通常是在60秒后,或者任务队列请求在10分钟后,会抛出这个错误。
  • google.appengine.runtime.apiproxy_errors.DeadlineExceededError: 如果一个远程过程调用(RPC)超出了它的时间限制,通常是5秒,但某些API可以通过'deadline'选项来设置。
  • google.appengine.api.urlfetch_errors.DeadlineExceededError: 如果 URLFetch 超时,会抛出这个错误。

撰写回答