5

タスクの実行中にソフト期限を処理する方法はありますか?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はこのエラーをまだスローするのですか?

4

2 に答える 2

4

9分後に例外を発生させる必要はありません。ソフト期限の例外が発生した場合、遅延を介してタスクキューにクリーンアップタスクを追加するのに十分な時間があります。

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

このようにして、アプリで必要なクリーンアップ作業を10分で行うことができます。

于 2011-01-22T10:54:36.710 に答える
4

ソフト期限超過エラーが発生するタイミングを制御することはできません。代わりに、独自のタイマーを使用し(開始時に実時間で取得し、メインループの各トリップの現在の時間と比較します)、停止する制限に十分近づいたときに中止する必要があります。

于 2011-01-24T00:48:57.483 に答える