[英]ndb.put_multi_async with cloud ndb
Google cloud ndb 文檔對異步操作的描述不多。
在過去,我會這樣做
@ndb.toplevel
@flask.route('/', methods=['GET'])
def page():
for x in xxx:
ndb.put_multi_async([...])
return 'Done', 200
並且頂層裝飾器將確保我的異步放置已完成。
我如何使用最新的 cloud ndb 執行此操作?
這個裝飾器的使用在很大程度上是不必要的,因為你應該使用 context() ,它在退出上下文時也會刷新掛起的工作。
但如果能更清楚一點會很有幫助。 什么時候仍然需要使用頂層?
就個人而言,我一直習慣於在我的異步 tasklet/操作上調用.get_result()
,所以這是我從未實際使用過的東西。
對於toplevel
,我能想到的唯一用例是,如果您想在到達請求處理程序的末尾之前強制進行刷新(因為在請求處理程序的末尾,您應該退出上下文)。 在下面的示例中,我們希望 operation_1 中的放置在operation_1
開始之前operation_2
:
@ndb.toplevel
def operation_1():
for x in xxx:
ndb.put_multi_async([...])
@flask.route('/', methods=['GET'])
def page():
operation_1()
operation_2()
return 'Done', 200
這對於可以運行長達 10 分鍾的 Google Cloud Tasks 的請求處理程序可能很有用,因此您可以在那里做很多事情。
正如NDB 異步操作文檔中所述:
為方便起見,您可以使用
@ndb.toplevel
裝飾請求處理程序。 這告訴處理程序在其異步請求完成之前不要退出。 ... 使用toplevel
應用程序比其所有處理函數更方便。
正如您所說,將NDB 客戶端庫與 Python 2 一起使用時,這很方便:
頂層裝飾器將確保我的異步放置已完成
現在使用Cloud NDB 庫,如這個答案所示,
每個導航台操作都需要包裝在上下文管理器中:
with ndb_client.context(): # <- you need this line cls.get_or_insert('master')
這就是為什么文檔說使用頂層裝飾器
在很大程度上是不必要的,因為您應該使用 context()
因為上下文裝飾器替換了它,它會
刷新掛起的 work_ 作為異步操作。
如Client
NDB 文檔中所述:
上下文用於管理與 Google Cloud Datastore 的連接、異步 API 調用的事件循環、運行時緩存策略和其他基本運行時 state。
最后,如ndb
遷移說明中所述:
最大的區別在於為 NDB 應用程序建立運行時上下文。 Google App Engine Python 2.7 運行時有一個強有力的假設,即所有代碼都在 web 框架請求-響應周期內執行,每個請求在一個線程中。 為了脫離該假設,Cloud NDB 實現了顯式客戶端和上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.