Если задания cron в Google App Engine имеют ограничение в 10 минут, то почему я получаю ошибку DeadlineExceededError после обычных 30 секунд?
Согласно https://developers.google.com/appengine/docs/python/config/cron задания cron могут выполняться в течение 10 минут. Тем не менее, когда я пытаюсь проверить его, перейдя по URL-адресу для задания cron при входе в систему как администратор, он завершается с DeadlineExceededError. Лучше всего я могу сказать, что это происходит примерно через 30 секунд, что является пределом не-cron для запросов. Нужно ли делать что-то особенное, чтобы проверить это по правилам cron против нормальных лимитов?
Вот что я делаю:
- Переход на URL для работы cron
- Это вызывает мой обработчик, который вызывает одну функцию в моем скрипте Py
- Эта функция выполняет вызов базы данных в облаке Google sql и проходит по полученным строкам, вызывая функцию в каждой строке, которая использует API ebay для получения некоторых данных.
- Данные из вызова ebay api хранятся в массиве, и все они записываются обратно в базу данных после выполнения всех вызовов.
- Когда цикл завершен, он записывает данные в базу данных и возвращает его обработчику
- Обработчик печатает готовое сообщение
Во время зацикливания вызовов ebay api всегда возникают проблемы. Это что-то вроде 500 вызовов API, которые должны быть сделаны в цикле.
Любая идея, почему я не получаю полных 10 минут для этого?
Изменить: я могу опубликовать фактический код, если вы думаете, что это поможет, но я предполагаю, что это процесс, который я делаю неправильно, а не ошибка в коде, так как он работает просто отлично, если я ограничиваю запрос до 60 API звонки.
2 ответа
То, как GAE выполняет задание cron, позволяет ему работать в течение 10 минут. Это, вероятно, делается (я просто догадываюсь здесь) путем проверки агента пользователя, IP-адреса или другого метода. Тот факт, что вы настроили задание cron для обращения к URL-адресу в вашем приложении, не означает, что стандартный HTTP-запрос от вашего браузера позволит ему работать в течение 10 минут.
Чтобы проверить, работает ли задание, нужно сделать это на локальном сервере разработчиков, где нет ограничений. Или дождитесь выполнения задания cron и проверьте журналы на наличие ошибок.
Надеюсь это поможет!
Вот как вы можете уточнить исключение и сказать, если это проблема urlfetch. Если исключение:
* google.appengine.runtime.DeadlineExceededError: raised if the overall request times out, typically after 60 seconds, or 10 minutes for task queue requests;
* google.appengine.runtime.apiproxy_errors.DeadlineExceededError: raised if an RPC exceeded its deadline. This is typically 5 seconds, but it is settable for some APIs using the 'deadline' option;
* google.appengine.api.urlfetch_errors.DeadlineExceededError: raised if the URLFetch times out.
затем посмотрите https://developers.google.com/appengine/articles/deadlineexceedederrors как это проблема с urlfetch.
Если время ожидания истекло, попробуйте установить более длительную продолжительность (например, 60 секунд):
result = urlfetch.fetch(url, deadline=60)