Google App Engine任务截止日期

时间:2011-01-22 05:37:33

标签: google-app-engine task-queue deadlines

有没有办法在执行任务时处理任何软截止日期? 执行10分钟后抛出DeadlineExceededError,之后几秒钟我就会做一些事情。 我想在任务终止之前清理一些事情并创建一个新任务。这可能需要几秒钟。有没有办法通过捕获大约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 个答案:

答案 0 :(得分:4)

9分钟后你不必提出异常;当软截止日期异常提升时,您有足够的时间通过Task Queuedeferred添加清理任务。

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

通过这种方式,您可以在应用程序中完成所需的任何清理工作。

答案 1 :(得分:4)

您无法控制何时超出软截止日期错误。相反,你应该使用自己的计时器(在你开始时占用挂钟时间,并将它与主循环周围每次旅行的当前时间进行比较),并在你足够接近你想要停止的限制时中止。 / p>