Как установить тайм-аут для 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 секунд, я думаю.