【发布时间】:2017-01-11 09:48:32
【问题描述】:
我在谷歌应用引擎上使用 python,并不断收到google.appengine.api.urlfetch_errors.DeadlineExceededError 来自执行某些后端处理的机器的请求。这些请求大约需要 60 秒,有时会更长一些,所以我试图延长截止日期。
请求包含在重试中,从日志中我可以看到重试之间的时间始终为 ~60 秒。我认为这要么是因为我配置错误,要么是误解了截止日期的限制。
机器配置是:
instance_class: B8
basic_scaling:
max_instances: 1
idle_timeout: 10m
我使用的代码是(为简单起见已编辑):
from google.appengine.api import urlfetch
from retrying import retry
timeout = 600
retries = 10
@retry(
stop_max_attempt_number=retries,
wait_exponential_multiplier=1000,
wait_exponential_max=1000*60*5
)
def fetch(url):
"""Fetch remote data, retrying as necessary"""
urlfetch.set_default_fetch_deadline(timeout)
result = urlfetch.fetch(url)
if result.status_code != 200:
raise IOError("Did not receive OK response from server")
return result.content
data = fetch(config['url'])
我已尝试将截止日期明确设置为 urlfetch.fetch(url, deadline=timeout),但设置默认值似乎是大多数人建议的方法。
谁能澄清是否可以为deadline 设置最大值?
【问题讨论】:
-
我很确定 60 秒是 urlfetch (和标准交互式请求)的最大值,但它似乎不再被记录。 60 秒是保持连接打开的很长一段时间 - 你最好轮询另一端?
-
谢谢snakecharmerb。老实说,我发现了相互矛盾的信息(其中一些可能来自旧版本的 GAE)。我发现消息来源声称 60 年代是最大值,而其他人则说这仅适用于
automatic_scaling类。当然,在 github 上进行搜索会发现很多人调用urlfetch.set_default_fetch_deadline()的值高于 60,并且鉴于我无法在文档中的任何地方找到记录的限制,我希望有人告诉我我只是遗漏了一些明显的东西! -
是的,不幸的是
set_default_fetch_deadline的文档字符串只是说“这个函数不对值进行任何范围或类型检查”,这不是很有帮助。不管限制如何,我都会考虑尝试一种不同的方法来避免长时间绑定实例,除非传输数据需要很长时间? FWIW 其价值this java doc 表示出站请求为 60 秒,您可以想象在 java-world 中也有同样的限制。, -
感谢您提供的链接 - 以前没见过那个链接。这听起来确实几乎是决定性的。这是一台通过 cron 运行后端任务的机器。该任务在获取数据文件后需要约 45 分钟的数据处理,因此需要一些处理时间不是问题。不幸的是,它获取的原始数据非常大(并且服务器非常慢),因此请求需要 60 秒 +/- 10 秒。我想我需要考虑拆分请求,但我不确定这是由我请求的服务器提供的。
-
如果遥控器支持它们,也许你可以使用sockets 而不是http?看起来他们可能不会超时至少两分钟。或者使用计算引擎实例而不是后端。
标签: python google-app-engine google-app-engine-python