【问题标题】:How to set timeout for urlfetch in Google App Engine?如何在 Google App Engine 中为 urlfetch 设置超时?
【发布时间】:2011-01-10 20:26:34
【问题描述】:

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

ApplicationError: 2 超时请求

方法:获取

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

异常类型:下载错误

异常值:ApplicationError: 2 timed out

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

感觉好像 12 秒后才会超时(我不确定,但确实很短)。

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

【问题讨论】:

    标签: python django google-app-engine timeout


    【解决方案1】:

    您可以使用fetch functiondeadline 参数来设置它。来自the docs

    请求处理程序的截止时间最长为 60 秒,任务队列和 cron 作业处理程序的截止时间最长为 10 分钟。如果deadline 为None,则deadline 设置为5 秒。


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

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

    this page 列出了默认的超时值:

    目前,Python 运行时有几个名为 DeadlineExceededError 的错误:

    • google.appengine.runtime.DeadlineExceededError:如果整个请求超时,通常在 60 秒后引发,对于任务队列请求则为 10 分钟。
    • google.appengine.runtime.apiproxy_errors.DeadlineExceededError:如果 RPC 超过其截止日期,则引发。这通常是 5 秒,但对于某些使用“截止日期”选项的 API 是可以设置的。
    • google.appengine.api.urlfetch_errors.DeadlineExceededError:如果 URLFetch 超时则引发。

    【讨论】:

    • 好的,我可以知道为什么当 OP 明确表示他正在使用 Django 时,您决定使用 Java 回答这个问题吗?您没有提供等效的 python :(
    • 别人在我给出答案两年后编辑了我的答案,并出于某种原因添加了 Java 代码 sn-p...如果您查看第一行中的超链接,它们链接到Python 文档。无论如何,Alex Young 的回答中都有一个 Python 示例。
    • 您链接到的文档不再包含任何最长 60 秒的提及。该限制是否已被弃用?
    【解决方案2】:

    对于 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。
    【解决方案3】:

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

    只需导入urlfetch,然后在代码中执行任何其他操作之前定义截止日期:

    from google.appengine.api import urlfetch
    
    urlfetch.set_default_fetch_deadline(60)
    

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2015-04-10
      • 2010-11-23
      相关资源
      最近更新 更多