App Engine Python URLFetch 超时

1 投票
5 回答
2829 浏览
提问于 2025-04-16 19:47

我有两个应用程序实例在运行,我想让它们通过一个Restful接口进行通信。当其中一个的数据更新时,它会调用第二个应用程序的一个网络钩子,这样第二个应用程序就可以获取最新的数据来更新自己的系统。

在'站点1'中,我有:

 from google.appengine.api import urlfetch

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

在'站点2'的data_updated处理程序中,我有:

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

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

 DeadlineExceededError: ApplicationError: 5 

有没有人能提供一些关于可能发生了什么的见解?

谢谢 - 理查德

5 个回答

1

你有没有试过手动访问这些网址(www.site2.com/data_updated 和 www.site1.com/get_new_data),比如用 curl 命令,看看它们是否在规定的时间内有回应?即使需要传输的数据量不大,也可能是处理这些请求的程序出了问题,导致返回结果的时间变长了。

3

App Engine的urlfetch有时候可能不会按照预期工作,你大约有10秒钟的时间去获取一个网址。假设你要获取的网址是正常运行的,你应该能够通过调用from google.appengine.runtime import apiproxy_errors来捕捉到DeadlineExceededError这个错误。具体做法是把urlfetch的调用放在一个try/except代码块里,使用except apiproxy_errors.DeadlineExceededError:来处理这个错误。

相关的答案可以在这里找到。

3

把方法从

  result = urlfetch.fetch(url)

改成

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

解决了截止时间的错误。

根据urlfetch的文档

截止时间是指你愿意等多久来获取远程主机的响应,单位是秒。如果在这个时间内远程主机没有回应,就会出现一个下载错误。

在等待请求的时间不会算入请求的CPU配额,但会算在请求的计时器里。如果在URL Fetch调用返回之前,请求的计时器到期了,这个调用就会被取消。

对于请求处理程序,截止时间最长可以设置为60秒,而对于任务队列和定时任务处理程序,最长可以设置为10分钟。如果截止时间设置为None,那么默认的截止时间是5秒。

撰写回答