Когда можно создать исключение DeadlineExceededError в Google App Engine - PullRequest
3 голосов
/ 14 января 2012

Я пишу отложенное задание, которое предназначено для создания файла в хранилище блогов для загрузки.Я моделирую код на примере, приведенном в документации:

http://code.google.com/appengine/articles/deferred.html

Идея состоит в том, чтобы структурировать код так, чтобы при возникновении DeadlineExceededError обработчик мог привести в порядок и запуститьновая отложенная задача, которая будет продолжена позже.

Что я хотел бы знать, когда именно это исключение может быть выдано?Существуют ли какие-либо операции, которые гарантированно будут атомарными и, следовательно, не будут прерваны?

В примере (указанном выше) они обновляют переменную с именем start_key по завершении обработки каждой записи, но говорят, что основной цикл был прерванмежду расширением списков to_put и to_delete тогда данные будут неправильными, так как они будут пропускать набор удалений.

Если исключение может быть вызвано в любой точке, то это может быть на полпути через batch_write,или между db.put и очисткой списка to_put.

Это логически эквивалентно проблеме безопасности потока, для ее решения обычно используются гарантированные атомарные операции и неатомарные операции.

Как это работает?

Спасибо

1 Ответ

2 голосов
/ 16 января 2012

Ошибка DeadlineExceededError может быть выдана буквально в любое время. Если бы было время, когда его нельзя было выбросить, приложение-нарушитель могло бы просто выполнить этот код в цикле.

Вы можете избежать этого несколькими способами:

  1. Предварительно проверьте, сколько времени вы выполняете, и остановитесь в подходящее время, прежде чем вы уложитесь в крайний срок.
  2. Поместите обработчик исключений куда-нибудь, чтобы он мог хранить состояние с последнего набора завершенных операций (например, отбрасывать что-либо со времени последней итерации внешнего цикла, в котором было сгенерировано исключение)
  3. Используйте бэкэнды, которые не имеют сроков.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...