Есть ли способ справиться с любым мягким сроком выполнения при выполнении задачи? DeadlineExceededError бросается после 10 минут исполнения, и мне дают несколько секунд после этого, чтобы сделать что-то. Я хочу очистить что-то до того, как задача умрет и создаст новую задачу. Это может занять несколько секунд. Есть ли способ сделать это, захватив любое исключение, например, около 9 минут. Я знаю, что могу вручную выбросить исключение через 9 минут. Но может ли это быть сделано автоматически GAE?Срок действия приложения Google App Engine
class FillMtxHandler():
def post(self,index,user,seqlen):
try :
FillMtx(index,user,seqlen)
except DeadlineExceededError:
deferred.defer(self.post,index,user,seqlen)
Выше мой код. index - это список и начинается с 0. Он будет увеличиваться внутри FillMtx. Как только крайний срок превысит ошибку, я хочу продолжить с того места, где индекс был увеличен последним. Я получаю следующее сообщение об ошибке
The API call taskqueue.BulkAdd() was explicitly cancelled.
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 517, in __call__
handler.post(*groups)
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 258, in post
run(self.request.body)
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 124, in run
return func(*args, **kwds)
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 166, in invoke_member
return getattr(obj, membername)(*args, **kwargs)
File "/base/data/home/apps/0xxopdp/3.347813391084738922/fillmtx.py", line 204, in post
deferred.defer(self.post,index,user,seqlen)
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/deferred/deferred.py", line 241, in defer
return task.add(queue, transactional=transactional)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/taskqueue/taskqueue.py", line 688, in add
return Queue(queue_name).add(self, transactional=transactional)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/taskqueue/taskqueue.py", line 744, in add
self.__AddTasks(tasks, transactional)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/taskqueue/taskqueue.py", line 770, in __AddTasks
apiproxy_stub_map.MakeSyncCall('taskqueue', 'BulkAdd', request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 86, in MakeSyncCall
return stubmap.MakeSyncCall(service, call, request, response)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 286, in MakeSyncCall
rpc.CheckSuccess()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 126, in CheckSuccess
raise self.exception
CancelledError: The API call taskqueue.BulkAdd() was explicitly cancelled.
Я нахожу, что новая задача была создана и поставлена в очередь. Но почему GAE все еще бросает эту ошибку?
Спасибо за ответ. В вашем сообщении об отложенном вам добавляется новая задача после того, как вы поймаете DeadlineExceededError. Можем ли мы быть уверены, что задача будет обязательно добавлена в очередь до ошибки жесткого срока? – Sam
@Sam Это должно быть добавлено, но возможно, что это не будет, как вы заметили. Если это не так, ваша задача будет решена (поскольку она не вышла чисто); ваш код может проверить, если это уже сделано, и пропустите прямо на фазу очистки, если это произойдет. –