Как установить тайм-аут для urlfetch в Google App Engine?
Я пытаюсь, чтобы Django (поверх GAE) извлекал данные из другой веб-службы. Я часто получаю ошибку, например:
ApplicationError: 2 тайм-аута Запрос
Метод: GET
URL-адрес запроса: http://localhost:8080/
Тип исключения: DownloadError
Значение исключения: ApplicationError: 2 тайм-аута
Исключение Место:/google_appengine/google/appengine/api/urlfetch.py в _get_fetch_result, строка 325
Похоже, что он будет тайм-аут только через 12 секунд (я не уверен, но он очень короткий).
Вопрос: как установить более длительный тайм-аут?
Ответы
Ответ 1
Вы можете установить его с помощью аргумента deadline
функции fetch. Из документы:
Крайний срок может быть не более 60 секунд для обработчиков запросов и 10 минут для очереди задач и обработчиков заданий cron. Если крайним сроком является None, крайний срок устанавливается в 5 секунд.
Изменить: выглядит так, как будто это изменилось. Из здесь:
Вы можете установить крайний срок для запроса, причем наибольшее количество времени ожидания службы ожидает ответа. По умолчанию крайний срок для выборки составляет 5 секунд. Вы можете настроить конечный срок по умолчанию для запросов, используя функцию urlfetch.set_default_fetch_deadline()
.
И эта страница отображает значения таймаута по умолчанию:
В настоящее время существует несколько ошибок с именем DeadlineExceededError для среды выполнения Python:
-
google.appengine.runtime.DeadlineExceededError
: повышен, если общий запрос истекает, как правило, через 60 секунд или 10 минут для запросов очереди задач. -
google.appengine.runtime.apiproxy_errors.DeadlineExceededError
: поднят, если RPC превысил свой срок. Обычно это 5 секунд, но он настраивается для некоторых API, используя параметр "крайний срок". -
google.appengine.api.urlfetch_errors.DeadlineExceededError
: поднят, если время URLFetch не выполнено.
Ответ 2
Увидев, что это вопрос Python
, я думал, что предоставил бы ответ Python для всех, кто сталкивается с этой проблемой.
Просто импортируйте urlfetch
, а затем определите крайний срок, прежде чем делать что-либо еще в своем коде:
from google.appengine.api import urlfetch
urlfetch.set_default_fetch_deadline(60)
Ответ 3
Для Go, вы можете попробовать выполнить код ниже.
// createClient is urlfetch.Client with Deadline
func createClient(context appengine.Context, t time.Duration) *http.Client {
return &http.Client{
Transport: &urlfetch.Transport{
Context: context,
Deadline: t,
},
}
}
Вот как его использовать.
// urlfetch
client := createClient(c, time.Second*60)
Ответ 4
Кажется коротким, но вы должны знать, что тайм-аут запроса на GAE составляет около 30 секунд. Поскольку вам, вероятно, необходимо выполнить некоторые операции с ответом вашего urlfetch, нет необходимости иметь таймаут более 10 секунд, я думаю.