谷歌云 ndb 檔案對異步操作沒有多說。
在過去,我會這樣做
@ndb.toplevel
@flask.route('/', methods=['GET'])
def page():
for x in xxx:
ndb.put_multi_async([...])
return 'Done', 200
頂級裝飾器將確保我的異步放置已完成。
如何使用最新的云 ndb 執行此操作?
頂級的云 ndb 檔案說
這個裝飾器的使用在很大程度上是不必要的,因為您應該使用 context() ,它也會在退出背景關系時重繪 待處理的作業。
但更清晰會有所幫助。什么時候還需要使用頂層?
uj5u.com熱心網友回復:
如NDB 異步操作的檔案中所述:
為方便起見,您可以使用
@ndb.toplevel. 這告訴處理程式在其異步請求完成之前不要退出。... 使用toplevel應用程式比它的所有處理函式更方便。
正如您所說,這在將NDB 客戶端庫與 Python 2 一起使用時很方便:
頂級裝飾器將確保我的異步放置已完成
現在使用Cloud NDB 庫,如this answer所示,
每個 NDB 操作都需要包裝在背景關系管理器中:
with ndb_client.context(): # <- you need this line cls.get_or_insert('master')
這就是為什么檔案說使用頂級裝飾器
很大程度上是不必要的,因為您應該使用 context()
因為背景關系裝飾器取代了它,它會
將掛起的 work_ 重繪 為異步操作。
如ClientNDB 檔案中所述:
背景關系用于管理與 Google Cloud Datastore 的連接、異步 API 呼叫的事件回圈、運行時快取策略和其他基本運行時狀態。
最后,如ndb 遷移說明中所述:
最大的區別在于為您的 NDB 應用程式建立運行時背景關系。Google App Engine Python 2.7 運行時強烈假設所有代碼都在 Web 框架請求-回應周期內執行,每個請求在單個執行緒中執行。為了擺脫這種假設,Cloud NDB 實作了顯式的客戶端和背景關系。
uj5u.com熱心網友回復:
就個人而言,我一直習慣于呼叫.get_result()我的異步任務/操作,所以這是我從未真正使用過的東西。
我能想到的唯一用例toplevel是,如果您想在請求處理程式結束之前強制重繪 (因為在請求處理程式結束時,您應該退出背景關系)。在下面的示例中,我們希望 put in在開始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 的請求處理程式很有用,因此您可以在那里做很多事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/465653.html
