app engine python urlfetch超时

时间:2011-06-17 16:27:13

标签: python google-app-engine urlfetch

我有两个运行app引擎应用程序的实例,我希望与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 

任何人都可以提供有关可能发生的事情的任何见解吗?

谢谢 - 理查德

5 个答案:

答案 0 :(得分:3)

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

相关答案here

答案 1 :(得分:3)

更改方法 从

  result = urlfetch.fetch(url)

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

修复了截止日期错误。

来自urlfetch documentation

  

<强>截止   等待响应的最长时间   远程主机,为秒数。如果远程主机没有   在这段时间内响应,引发了一个DownloadError。

     

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

     

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

如果您正在与之交谈的应用经常采取&gt; 10秒响应,你将不得不在另一个云平台(EC2等)上使用“代理回调”服务器。如果你可以暂时停留一段时间新的后端实例应该稍微放宽urlfetch时间限制。

如果平均响应时间<1。 10秒,只有相对较少的失败,只需重试几次。我希望你的呼吁是幂等的(即重试不会产生不利影响)。如果没有,你可能可以在顶层滚动你自己的图层 - 这有点痛苦,但它运作正常,这就是我们的工作。

Ĵ

答案 4 :(得分:1)

GAE文件现在规定截止日期为60秒:

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