2011-01-22 2 views
5

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

ответ

4

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

+0

Спасибо за ответ. В вашем сообщении об отложенном вам добавляется новая задача после того, как вы поймаете DeadlineExceededError. Можем ли мы быть уверены, что задача будет обязательно добавлена ​​в очередь до ошибки жесткого срока? – Sam

+0

@Sam Это должно быть добавлено, но возможно, что это не будет, как вы заметили. Если это не так, ваша задача будет решена (поскольку она не вышла чисто); ваш код может проверить, если это уже сделано, и пропустите прямо на фазу очистки, если это произойдет. –

4

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

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

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

+0

Как я могу быть уверен, что задача будет добавлена ​​в очередь задач до того, как будет достигнут жесткий предел? я получаю «CancelledError: вызов вызова API» .BulkAdd() был явно отменен », даже если задача была добавлена. – Sam

+0

Если у вас закончилось изящество, то CancelledError запустится. – systempuntoout

+0

deferred.defer и taskqueue.add ведут себя одинаково Вот. В обоих случаях я получаю «Отмененную ошибку», потому что процесс добавления задачи в очередь не был завершен до трудного временного ограничения. http://code.google.com/appengine/articles/deferred.html, как он может обновить db и создать задачу до льготного периода? – Sam

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