我有一個調用少量tasklet的POST
方法。這些tasklet在它們中確實有產量,而且我的代碼中有一些x.put_async()
。所以我不希望它在所有異步內容完成之前都返回。所以我裝飾了我所有的小工具,這些小工具都是@ndb.tasklet
。此外,在我的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
方法中,但問題仍然存在。
我應該把@ndb.tasklet
放在剛好put_async()
的方法之上嗎? (我應該把它放在每種方法的最上面以保證安全嗎?
良好的答覆!規則可以總結如下:(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,但也等待所有未完成的操作完成。 –