10

いくつPOSTかのタスクレットを呼び出すメソッドがあります。これらのタスクレットにはyieldがありx.put_async()、私のコードにもいくつかあります。したがって、すべての非同期処理が完了する前に戻りたくありません。だから私はすべてのタスクレットを装飾しました。これは単なる小さな関数であり、@ndb.tasklet. また、私のPOST方法の上に、私は持っています:

@ndb.toplevel
def post(self):

ただし、ドキュメントには次のように記載されています。

しかし、ハンドラ メソッドが yield を使用する場合、そのメソッドは別のデコレータ @ndb.synctasklet でラップする必要があります。そうしないと、yield で実行が停止し、終了しません。

実際、私の方法には収量があります。すでに @ndb.tasklet にラップされています。これを @ndb.synctasklet に置き換えますか、それとも両方を使用しますか?

また、いくつかの関連性があるこのスレッドを参照してください。私も、リクエストが出力なしで返されるが、再現できないという問題に気付きました。一定の使用で15分ごとに発生します。私は持っていましたが、今はメインのメソッドにapp = ndb.toplevel(webapp2.WSGIApplication([..])追加しましたが、問題は解決しません。@ndb.toplevelPOST

@ndb.taskletもあるメソッドの上に置くべきput_async()ですか?(安全のためにすべてのメソッドの上に置く必要がありますか?これの欠点は何ですか?)

4

1 に答える 1

10

ハンドラーと @ndb.toplevel および @ndb.synctasklet の使用について: 私が理解した方法は、ハンドラーで @ndb.synctasklet と @ndb.toplevel の両方を使用する必要があるということでした。サブタスクレットはすべて @ndb.tasklet デコレータのみを必要とします。例えば

class Foo(ndb.Model):
    name = ndb.StringProperty()

    @ndb.tasklet
    def my_async(self):
        ....
        #do something else that yields
        raise ndb.Return("some result")   


@ndb.toplevel
@ndb.synctasklet
def post(self):
    foo = Foo(name="baz")
    yield foo.put_async()
    yield foo.my_async()
    ....

でも。sourceを見ると、@ndb.toplevel は実際には synctasklet のようです。

def toplevel(func):
  """A sync tasklet that sets a fresh default Context.

  Use this for toplevel view functions such as
  webapp.RequestHandler.get() or Django view functions.
  """

ハンドラーで生成され、@ndb.toplevel で装飾された小さなテストを実行しても機能するようで、ハンドラーから @ndb.synctasklet を削除できるようです。

put_async() を呼び出すメソッドに @ndb.tasklet を含める必要があるかどうかについて: put_async() で譲歩しない場合は、周囲のメソッド (@ndb.toplevel) に @ndb.tasklet を含める必要はありません。 put_async() からの結果の取得を処理します)

于 2012-09-04T05:24:20.737 に答える