2012-07-23 31 views
7

我正在使用ndb編寫一個分析模型,該模型會記錄每個應用程序請求的一些數據。每個請求都會通過ndb.put_async調用ndb請求來記錄數據,而客戶端不關心結果。實質上,我不希望應用程序請求等待保存用於分析的統計數據。ndb異步保證在應用程序請求完成後執行?

但是,我對官方文檔的解釋感到困惑。如果一個應用程序請求在ndb請求結束之前完成,ndb請求是否仍能保證完成?文檔表示

如果請求處理程序太早存在,看跌期權可能永遠不會發生

在這種情況會發生什麼樣的標準?這是否意味着無論用戶是否關心結果,都需要調用future.get_result來確保ndb請求被執行?

的原始文件(https://developers.google.com/appengine/docs/python/ndb/async)說:

在這個例子中,這是一個有點傻叫future.get_result:在 應用程序從不使用從NDB結果。該代碼僅在 以確保在NDB將 完成之前請求處理程序不會退出;如果請求處理器過早退出,則可能永遠不會發生 。作爲一種方便,您可以用 @ ndb.toplevel來裝飾請求處理程序。這告訴處理程序不要退出,直到其異步請求完成 。這又可以讓你發送 的請求,而不用擔心結果。

回答

7

如果一個應用程序請求的NDB請求之前完成完成後,將在NDB請求還是可以保證的完嗎?

這是否意味着,無論是否對結果的用戶關懷,future.get_result需要被稱爲反正只是爲了確保執行NDB要求?

基本上可以,但是您可以使用ndb.toplevel裝飾器以方便您,無需等待顯式結果。這就是說,我不認爲這是你想要的。可能taskqueue是你想要的。請檢查一下。

+3

爲了澄清,可能不會發生的原因是NDB的自動配料功能。表示put的Future可以位於自動分配器的隊列中,並且@ ndb.toplevel裝飾器是唯一可靠的方法(除了顯式調用get_result())以確保坐在這樣的隊列中的所有put請求都被髮送到服務器。 – 2012-07-24 19:17:14

1

感謝您的澄清。關於一般RPC(非NDB) - 例如memcache.Client()中的incr_async()如何?拋開這一點,這是一個非常非常快速的RPC調用,是否可以保證RPC能夠完成?

I.e.,下列哪項是正確的:

(一)有東西在基礎設施,將等待上所有已知的RPC完成請求之前

(二)請求將完成與異步的RPC也將完成無論何時請求完成

(C)的飛行RPC是正式取消

(d)其他的東西?

+1

請發佈這樣的更新作爲評論,編輯您的問題,或一個新的問題 - 只有答案應張貼爲答案。 – 2012-07-27 05:31:46

+1

雖然你的問題的答案是(a)。 – 2012-07-27 05:32:30

相關問題