Срок выполнения задач Google App Engine - PullRequest
5 голосов
/ 22 января 2011

есть ли способ справиться с любым мягким крайним сроком при выполнении задачи?DeadlineExceededError генерируется после 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)

Выше приведен мой код.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 все еще выдает эту ошибку?

Ответы [ 2 ]

4 голосов
/ 24 января 2011

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

4 голосов
/ 22 января 2011

Вам не нужно выдавать исключение через 9 минут;когда возникает исключение мягкого крайнего срока, у вас есть достаточно времени, чтобы добавить задачу cleanup в Task Queue через deferred .

from google.appengine.ext import deferred
...
try:
  # Do your stuff
except DeadlineExceededError:
  deferred.defer(do_your_cleanup, ..) 

Таким образом, у вас есть 10 минут, чтобы выполнить все необходимые действия по очистке в вашем приложении.

...