【问题标题】:app engine python urlfetch timing out应用引擎 python urlfetch 超时
【发布时间】:2011-06-17 16:27:13
【问题描述】:

我有两个正在运行的应用引擎应用程序实例,我想与一个 Restful 接口进行通信。一旦更新了其中一个的数据,它就会在第二个上调用一个 web 挂钩,该挂钩将为它自己的系统检索数据的新副本。 在“site1”里面我有:

 from google.appengine.api import urlfetch

 url = www.site2.com/data_updated
 result = urlfetch.fetch(url)

在“site2”上的 data_updated 处理程序中,我有:

 url = www.site1.com/get_new_data
 result = urlfetch.fetch(url)

两个站点之间传递的数据很少,但我收到以下错误。我尝试将截止日期增加到 10 秒,但这仍然不起作用。

 DeadlineExceededError: ApplicationError: 5 

谁能提供任何关于可能发生的事情的见解?

谢谢 - 理查德

【问题讨论】:

  • urlfetch 有一些我观察到的不一致之处,您是否尝试过 python 标准 urllib2.urlopen(url).read() 而不是 urlfetch.fetch(url)
  • 这是在 dev_appserver 上吗? dev_appserver 是单线程的,因此如果在处理请求时尝试从其中获取某些内容,它将超时。
  • @Nick - 嗨尼克,没有两台服务器都在生产应用程序引擎上运行。
  • @Adithya - 是的,我们也尝试过。

标签: python google-app-engine urlfetch


【解决方案1】:

App Engine 的 urlfetch 并不总是按预期运行,您有大约 10 秒的时间来获取 URL。假设您尝试获取的 URL 已启动并正在运行,您应该能够通过调用 from google.appengine.runtime import apiproxy_errors 来捕获 DeadlineExceededError,然后使用 except apiproxy_errors.DeadlineExceededError: 将 urlfetch 调用包装在 try/except 块中。

相关回答here

【讨论】:

    【解决方案2】:

    改变方法 来自

      result = urlfetch.fetch(url)
    

      result = urlfetch(url,deadline=2,method=urlfetch.POST)
    

    已修复截止日期错误。

    来自urlfetch documentation

    截止日期 等待响应的最长时间 远程主机,以秒为单位。如果远程主机没有 在这段时间内响应,会引发 DownloadError。

    等待请求所花费的时间不计入 CPU 配额 为请求。它确实计入请求计时器。如果应用程序 请求计时器在 URL Fetch 调用返回之前到期,调用是 取消。

    请求处理程序的截止时间最长为 60 秒 任务队列和 cron 作业处理程序需要 10 分钟。如果截止日期是 无,最后期限设置为 5 秒。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 curl 或其他方式手动查询 URL(www.site2.com/data_updated 和 www.site1.com/get_new_data)以确保它们在时限内响应?即使需要传输的数据量很小,也可能是处理程序存在问题,导致返回结果出现延迟。

      【讨论】:

      • 嗨,丹,是的,我试过这样做。他们俩都在响应良好
      【解决方案4】:

      这里传输的数据量不是问题,延迟才是问题。

      如果您正在与之交谈的应用程序的响应时间通常超过 10 秒,那么您将不得不使用另一个云平台(EC2 等)上的“代理回调”服务器。如果您可以推迟一段时间,那么新的后端实例应该稍微放宽 urlfetch 时间限制。

      如果平均响应时间

      J

      【讨论】:

      • (另一件可能会引起您注意的事情是启动时间 - 如果您的数据服务很冷,初始查询可能会超时。尝试通过一些 cron 请求使其保持温暖,看看是否有帮助?)
      【解决方案5】:

      GAE 文档现在声明截止日期可以是 60 秒:

      result = urlfetch(url,deadline=60,method=urlfetch.POST)
      

      【讨论】:

        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2014-03-09
        • 2011-06-15
        • 2019-03-16
        相关资源
        最近更新 更多