【问题标题】:HTTPException: Deadline exceeded while waiting for HTTP response from URL: #deadlineHTTPException:等待来自 URL 的 HTTP 响应时超过了截止日期:#deadline
【发布时间】:2013-01-19 19:46:55
【问题描述】:

我们正在使用开发人员 Python 指南和 Python 数据 2.15 库,并按照应用引擎的示例说明。 createSite("测试站点一", description="测试站点一", source_site =("https://sites.google.com/feeds/site/googleappsforus.com/google-site-template" ))

每次使用时,我们都会收到无法预测的响应。

异常: HTTPException:在等待来自 URL:https://sites.google.com/feeds/site/googleappsforyou.com 的 HTTP 响应时超出了截止日期

有人遇到过同样的问题吗?是 AppEngine 还是 Sites API 相关的?

问候,

【问题讨论】:

  • 仅供参考:您应该在 google-appengine 类别下正确标记此问题,并且可能还有 Google API 客户端(如果存在)。

标签: google-app-engine google-api-python-client deadlines


【解决方案1】:

在使用最新版本的httplib2googleapiclient 时,接受的解决方案对我不起作用。问题似乎是httplib2.Http 将它的超时参数一直传递给urlfetch。由于它的默认值为None,因此urlfetch 将该请求的限制设置为5 秒,而不管您使用urlfetch.set_default_fetch_deadline 设置的默认值如何。看来您有几个选择。

第一个选项——您可以显式传递httplib2.Http 的实例:

http = httplib2.Http(timeout=30)
...
client.method().execute(http=http)

第二个选项,可以使用sockets设置默认值1

import socket
socket.setdefaulttimeout(30)

第三个选项,您可以告诉 appengine 为请求使用套接字2。为此,你modify app.yaml

env_variables:
   GAE_USE_SOCKETS_HTTPLIB : 'anyvalue'

1可能仅适用于付费应用,因为未付费应用可能不存在套接字 api...
2我几乎可以肯定这仅适用于付费应用,因为套接字 api 不适用于非付费应用...

【讨论】:

    【解决方案2】:

    在等待来自 URL 的 HTTP 响应时超出了最后期限实际上是一个 DeadlineExceededError。当您发出 HTTP 请求时,App Engine 会将此请求映射到 URLFetch。 URLFetch 有自己的可配置的截止日期。请参阅URLFetch documentation

    您的客户端库似乎捕获了 DeadlineExceededError 并抛出了 HTTPException。您的客户端库将截止日期传递给 URLFetch(您需要更改),或者默认截止日期不足以满足您的请求。

    尝试像这样设置默认的 URLFetch 截止日期:

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

    另外请务必查看官方文档中的Dealing with DeadlineExceededErrors

    请记住,任何最终用户发起的请求都必须在 60 秒内完成,否则会遇到 DeadlineExceededError。见App Engine Python Runtime Request Timer

    【讨论】:

    • 您好 Bernd,感谢您的回复。即使我们将 Fetch 时间增加到 45 秒,我们仍然遇到截止日期问题 - 我们在一天内创建了大约 50 个站点,其中 25% 的站点由于截止日期异常而失败。我们如何处理截止日期异常?有哪些解决方法?我们每天创建大约 30-40 个网站,如果可以的话,我们希望解决这个问题。提前感谢您的帮助。
    • 导入的其实是:from google.appengine.api import urlfetch
    • 如果在减去请求处理程序开销的 60 秒内无法获取您要获取的内容,您将需要从 TaskQueue 发起的请求或在其上运行的请求中获取(调用)URL后端。使用这两种方法中的任何一种时,您都可以将最后期限延长至 10 分钟。
    • @Bernd Verst 有什么办法可以处理这个异常吗?由于超过了请求截止日期,我正在终止进程。 (错误代码 123)错误。
    • @BerndVerst 我遇到了同样的错误。在我的应用程序中,它端点建立数据库连接,获取数据并关闭连接并返回数据。但它抛出错误代码 123。当我检查时,有 900 个数据库连接和 150 多个实例已启动。我重新启动了我的数据库,问题解决了吗?我该如何解决这个问题的原因是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多