【问题标题】:Google App Engine Task DeadlineGoogle App Engine 任务截止日期
【发布时间】:2011-01-22 05:37:33
【问题描述】:

有没有办法在执行任务时处理任何软期限? 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 还是会抛出这个错误呢?

【问题讨论】:

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


    【解决方案1】:

    您无法控制何时收到超过软期限错误。相反,您应该使用自己的计时器(开始时获取挂钟时间,并将其与主循环的每次行程的当前时间进行比较),并在您足够接近您想要停止的限制时中止。

    【讨论】:

    • 感谢您的回复。在您关于延迟的帖子中,您在捕获 DeadlineExceededError 后添加了一个新任务。我们能确定任务一定会在硬期限错误之前被添加到队列中吗?
    • @Sam 通常应该添加它,但正如您所观察到的那样,它可能不会添加。但是,如果没有,您的任务将被重新排队(因为它没有干净地退出);然后你的代码可以检查它是否已经完成了工作,如果已经完成,则直接跳到清理阶段。
    【解决方案2】:

    您不必在 9 分钟后引发异常;当软期限异常引发时,您有足够的时间通过deferred清理 任务添加到Task Queue

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

    通过这种方式,您有 10 分钟的时间在您的应用中做任何您需要的清理工作。

    【讨论】:

    • 如何确保在达到硬限制之前将任务添加到任务队列中?即使已添加任务,我也会收到“CancelledError:API 调用 taskqueue.BulkAdd() 已显式取消”
    • 如果你的宽限期用完了,CancelledError 就会启动。
    • deferred.defer 和 taskqueue.add 在这里的行为方式相同。在这两种情况下,我都会收到“已取消错误”,因为在硬时间限制之前未完成将任务添加到队列的过程。 code.google.com/appengine/articles/deferred.html他如何在宽限期之前更新数据库并创建任务?
    • 我已经修改了问题。我已经添加了我的代码和错误日志
    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2011-03-25
    相关资源
    最近更新 更多