簡體   English   中英

ndb.put_multi_async 與雲 ndb

[英]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 執行此操作?

頂層的雲 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM