2012-09-04 6 views
10

私は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を置くべきですか?

答えて

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.taskletを含める必要はありません(@ ndb.toplevelはput_async()からの結果の取得を処理します)

+12

良い返信です!ルールは次のように要約できます。(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と似ていますが、保留中のすべての操作が完了するまで待機します。 –

関連する問題