Вопрос

Есть ли способ справиться с любым мягким сроком во время выполнения задачи? 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 минут, чтобы сделать любые чистящие вещи, которые вам нужны в вашем приложении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top