4

Я использую Google AppEngine и отложенную библиотеку с классом Mapper, как описано here (с некоторыми улучшениями, как в here). В некоторых итераций картографа я получаю следующее сообщение об ошибке:Ошибка AppEngine 'явно отменена'

CancelledError: The API call datastore_v3.Put() was explicitly cancelled. 

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

Чтобы быть уверенным, я уменьшил batch_size до очень низкого числа, так что он даже не попал в DeadlineExceededError, но я все еще получаю CancelledError.

Трассировка стека выглядит следующим образом:

File "utils.py", line 114, in _continue 
    self._batch_write() 
File "utils.py", line 76, in _batch_write 
    db.put(self.to_put) 
File "/google/appengine/ext/db/__init__.py", line 1238, in put 
    keys = datastore.Put(entities, rpc=rpc) 
File "/google/appengine/api/datastore.py", line 255, in Put 
    'datastore_v3', 'Put', req, datastore_pb.PutResponse(), rpc) 
File "/google/appengine/api/datastore.py", line 177, in _MakeSyncCall 
    rpc.check_success() 
File "/google/appengine/api/apiproxy_stub_map.py", line 474, in check_success 
    self.__rpc.CheckSuccess() 
File "/google/appengine/api/apiproxy_rpc.py", line 126, in CheckSuccess 
    raise self.exception 
CancelledError: The API call datastore_v3.Put() was explicitly cancelled. 

Я не могу найти много информации об этом «отменен» в явной ошибки, поэтому мне было интересно, что стало причиной его и как исследовать.

ответ

1

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

Если вы бежите из времени светлость CancelledError пинки в.

Там не должно быть никакого способа, чтобы поймать/обрабатывать CancelledError

+0

Я подозревал, что. Тем не менее, класс «Mapper» был разработан для обработки таких вещей. Он даже имеет размер партии по умолчанию 200. Какие вещи влияют на время, которое требуется для 'db.put()' для завершения/возврата? Я предположил, что это был только размер партии, поэтому использование меньших партий (всего 4!) Ускорит старт и избежит «CancelledError». Существуют ли другие вещи, которые заставляют 'db.put()' занимать больше времени, чтобы я мог оптимизировать? (Больше индексов? ListProperties? ReferenceProperties?) – noio

+0

Любая идея, «как мы можем избежать этого?» – Femina

+0

Я не уверен, что этот ответ по-прежнему верен. Я вижу, что эти исключения возникают в Taskqueues (которые имеют 10-минутный временной интервал) примерно через 54 секунды в запросе. – speedplane

Смежные вопросы