私はPOST
というメソッドをいくつかのタスクレットを呼び出します。これらのタスクレットには利回りがあり、私のコードにはx.put_async()
があります。だから私はそれが非同期のものがすべて完了する前に戻ってほしくない。だから私は@ndb.tasklet
とちょうど小さな関数であるすべての私のtaskletsを飾った。また、私のPOST
方法の上に、私が持っている:Google App Engineで@ ndb.taskletまたは@ ndb.synctaskletを使用する
をしかし、ハンドラメソッドが降伏を使用する場合、その方法はまだで をラップする必要があります
@ndb.toplevel def post(self):
をしかし、documentationでは述べて別のデコレータ、@ ndb.synctasklet;それ以外の場合は、 は実行を停止して終了しません。
実際、私の方法は収率があります。すでに@ ndb.taskletにラップされています。これを@ ndb.synctaskletに置き換えるか、両方を使用しますか?
また、関連性のあるthis threadも参照してください。私は、私の要求が何の出力もなく返ってくるが、再現性がないという問題に気づいた。それは15分ごとに毎回行われます。私はapp = ndb.toplevel(webapp2.WSGIApplication([..])
しか持っていませんでしたが、@ndb.toplevel
をメインのPOST
メソッドに追加しましたが、それでも問題は解決しません。
ちょうどput_async()
のメソッドの上に@ndb.tasklet
を置くべきですか?
良い返信です!ルールは次のように要約できます。(1)関数が "yield"を使用する場合は、ndb.tasklet、ndb.synctasklet、またはndb.toplevelを指定する必要があります。 (2)ndb.taskletにラップされた関数がFutureを返します(それを返すか、明示的にget_result()を呼び出すことができます)。 (3)ndb.synctaskletはndb.taskletにラッピングしているのと同じですが、暗黙的にget_result()を呼び出しています。 (4)ndb.toplevelはndb.synctaskletと似ていますが、保留中のすべての操作が完了するまで待機します。 –