Я использую python в движке Google, и продолжаю получать google.appengine.api.urlfetch_errors.DeadlineExceededError
по запросам, сделанным с машины, которая выполняет некоторую обработку. Запросы занимают примерно 60 секунд, иногда немного дольше, поэтому я попытался увеличить срок.Является ли google.appengine.api.urlfetch крайним сроком до 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
Спасибо snakecharmerb. Честно говоря, я нашел противоречивую информацию (некоторые из них могут быть из более старых версий GAE). Я обнаружил, что источники, требующие 60-х, являются максимальными, а другие говорят, что это относится только к классам «automatic_scaling». Конечно, поиск в github находит много людей, вызывающих 'urlfetch.set_default_fetch_deadline()' со значениями выше 60, и учитывая, что я не могу найти ограничение, зарегистрированное где угодно в документах, которые мне бы хотелось, чтобы кто-то сказал мне, что я просто отсутствует что-то очевидное! –
Да, к сожалению, docstring для 'set_default_fetch_deadline' просто говорит:« Эта функция не выполняет никакой проверки диапазона или типа значения », что не очень полезно. Независимо от ограничения, я бы подумал о том, чтобы попытаться использовать другой подход, чтобы не связывать экземпляр так долго, если не потребуется так много времени для переноса данных? FWIW его ценность [этот java doc] (https://cloud.google.com/appengine/docs/java/outbound-requests#request_timeouts) говорит 60-е годы для исходящего запроса, вы можете предположить, что те же ограничения применяются в java-world ., – snakecharmerb