Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python google.appengine.api.urlfetch的截止日期是否限制在60秒?_Python_Google App Engine_Google App Engine Python - Fatal编程技术网

Python google.appengine.api.urlfetch的截止日期是否限制在60秒?

Python google.appengine.api.urlfetch的截止日期是否限制在60秒?,python,google-app-engine,google-app-engine-python,Python,Google App Engine,Google App Engine Python,我在google app engine上使用python,并且在执行一些后端处理的机器发出的请求上不断得到google.appengine.api.urlfetch_errors.DeadlineExceededError。这些请求大约需要60秒,有时需要更长的时间,所以我试图增加截止日期 请求被包装在重试中,从日志中我可以看到重试之间的时间总是~60秒。我认为这可能是因为我配置不正确,或者误解了截止日期的限制 机器配置为: instance_class: B8 basic_scaling:

我在google app engine上使用python,并且在执行一些后端处理的机器发出的请求上不断得到
google.appengine.api.urlfetch_errors.DeadlineExceededError
。这些请求大约需要60秒,有时需要更长的时间,所以我试图增加截止日期

请求被包装在重试中,从日志中我可以看到重试之间的时间总是~60秒。我认为这可能是因为我配置不正确,或者误解了截止日期的限制

机器配置为:

instance_class: B8
basic_scaling:
  max_instances: 1
  idle_timeout: 10m
我使用的代码是(为简单起见进行了编辑):

我尝试过将截止日期显式设置为
urlfetch.fetch(url,deadline=timeout)
,但大多数人建议的方法似乎是设置默认值

有谁能澄清一下,是否有一个最大值可以为请求计时器设置

googleappengine请求计时器(Java/Python/Go)确保请求具有有限的生命周期,并且不会陷入无限循环。目前,前端实例请求的截止时间为60秒。(后端实例没有相应的限制。)每个请求,包括预热(请求到/_ah/warmup)和加载请求(“加载_请求=1”日志头),都受此限制

如果请求未能在60秒内返回,并且抛出DeadlineExceededError且未捕获,则请求将中止,并返回500内部服务器错误。如果捕获到DeadLineExceeDerror,但响应速度不够快(您的响应时间不足一秒),则请求将中止,并返回500内部服务器错误

就我阅读文档而言,我认为应用程序引擎中的最大请求超时时间是60秒。

我很确定60秒是urlfetch(和标准交互请求)的最大时间,但似乎不再有文档记录。60秒是一个很长的时间来保持连接打开-你可能会更好地轮询对方?谢谢snakecharmerb。老实说,我发现了相互矛盾的信息(其中一些可能来自GAE的旧版本)。我发现有消息称60秒是最大值,还有人说这只适用于
自动缩放类。当然,在github上搜索会发现很多人调用
urlfetch.set\u default\u fetch\u deadline()
,其值高于60,而且我在文档中找不到任何地方记录的限制,我希望有人告诉我,我只是遗漏了一些明显的东西!是的,不幸的是,
set\u default\u fetch\u deadline
的docstring只是说“这个函数不做任何值的范围或类型检查”,这不是很有帮助。尽管有限制,我还是会考虑尝试另一种方法,以避免占用实例太长时间,除非传输数据需要那么长时间?FWIW its worth表示,对于一个出站请求,您可以想象同样的限制适用于java世界。感谢您的链接-以前从未见过这样的链接。这听起来几乎是决定性的。这是一台通过cron运行后端任务的机器。提取数据文件后,该任务需要约45分钟的数据处理时间,因此需要一些处理时间不是问题。不幸的是,它获取的原始数据非常大(服务器非常慢),因此请求需要60秒+/-10秒。我想我需要考虑将请求拆分,但我不确定这是由我请求的服务器提供的。如果远程设备支持,也许您可以使用http来代替它们?看起来他们至少有两分钟不会超时。或者使用计算引擎实例而不是后端。感谢Bravin,我已经阅读了该文档,并且正在使用它的建议,但是当我更改最后期限(例如,到600秒)时最长60秒后似乎仍然超时。我想确定的是是否有一个最大值作为限制,或者我的代码是否出错。感谢您抽出时间回复,但这是
google.appengine.runtime.DeadlineExceededError
而不是
google.appengine.api.urlfetch\u errors.DeadlineExceededError
。此外,请求截止日期仅指自动扩展的实例。手动和基本缩放实例都可以@JamieCollinson,我敢肯定60秒是urlfetch(和标准交互请求)的最大时间,但似乎不再有文档记录。60秒是一个很长的时间保持连接打开-你可能会更好地轮询对方?例如,应用程序引擎队列。
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'])