Крайний срок задачи двигателя Google App
-
16-10-2019 - |
Вопрос
Есть ли способ справиться с любым мягким сроком во время выполнения задачи? DeadlineExedEdError брошен после 10 минут исполнения, и после этого мне дают несколько секунд, чтобы сделать что -то. Я хочу кое -что очистить, прежде чем задача умрет и создать новую задачу. Это может занять несколько секунд. Есть ли способ сделать это, запечатлев любое исключение, как около 9 минут. Я знаю, что могу вручную бросить исключение через 9 минут. Но можно ли это сделать автоматически GAE?
class FillMtxHandler():
def post(self,index,user,seqlen):
try :
FillMtx(index,user,seqlen)
except DeadlineExceededError:
deferred.defer(self.post,index,user,seqlen)
Выше это код. Индекс - это список и начинается с 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 все еще бросает эту ошибку?
Решение
Вы не можете контролировать, когда получите ошибку мягкого срока. Вместо этого вы должны использовать свой собственный таймер (принять время на WallClock, когда вы начинаете, и сравнить его с текущим временем в каждой поездке вокруг вашего основного цикла) и прервать, когда вы достаточно близко к пределу, который вы хотите остановить.
Другие советы
Вам не нужно поднимать исключение через 9 минут; Когда исключение мягкого срока поднимается, у вас достаточно времени, чтобы добавить уборка задача Очередь задач с помощью отсрочен.
from google.appengine.ext import deferred
...
try:
# Do your stuff
except DeadlineExceededError:
deferred.defer(do_your_cleanup, ..)
Таким образом, у вас есть 10 минут, чтобы сделать любые чистящие вещи, которые вам нужны в вашем приложении.