【问题标题】:Why am I seeing Deadline exceeded HTTPException from deferred?为什么我看到 Deferred 中的 Deadline 超出了 HTTPException?
【发布时间】:2019-04-05 03:36:57
【问题描述】:

为什么我在 App Engine 上从 defer(仅限)内发出 HTTP 请求时会看到“已超出截止日期”HTTPException?当我使用 urllib2(见下文)发出请求时,我设置了超时(540 秒),但我的请求在 180 秒左右超时。使用 Cloud SDK 和 Djangae,同样的请求在本地也能正常工作。

    req = urllib2.Request(
        settings.ENDPOINT,
        json_data,
        {
            'Content-Type': 'application/json',
            'X-API-KEY': settings.SOME_KEY,
        }
    )
    response = urllib2.urlopen(req, timeout=settings.SOME_TIMEOUT)

更新:

我还尝试通过set_default_fetch_deadline 将全局google.appengine.api.urlfetch 超时设置为540,但没有成功。

【问题讨论】:

  • 您是在问为什么它在 180 秒后超时(而不是您指定的 540 秒),还是在问它为什么会出现“超出截止日期”异常?即,在本地运行时,请求是否在合理的时间(
  • 嗨,@MykWillis。如果我设置的超时高于此,我在问为什么请求会在约 180 秒后超时。

标签: google-app-engine urllib2 djangae


【解决方案1】:

我的代码中总是出现这些警告:

/base/data/home/apps/s~my-project-id/version-id/lib/urllib3/contrib/appengine.py:256: AppEnginePlatformWarning:URLFetch 不支持粒度超时 设置,恢复为总或默认 URLFetch 超时。

urllib2 可能会遇到同样的问题,但不会像 urllib3 那样记录警告

编辑:

我刚刚注意到您说您还尝试设置 urlfetch 的全局超时。 Java 文档是这么说的

HTTP(S) 请求的最长截止时间为 60 秒

由于某种原因,python 文档中没有这种情况,但我的猜测是,无论您将超时设置为什么,您都会受到一些内部最大超时值的限制。

https://cloud.google.com/appengine/docs/standard/java/outbound-requests#request_timeouts

【讨论】:

  • 共识似乎是(在各种论坛和this Google ticket 中)限制正如您所描述的那样。围绕该主题存在很多混淆,不清楚为什么 Google 没有明确记录此行为。
猜你喜欢
  • 2013-01-19
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多