我正在使用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來裝飾請求處理程序。這告訴處理程序不要退出,直到其異步請求完成 。這又可以讓你發送 的請求,而不用擔心結果。
爲了澄清,可能不會發生的原因是NDB的自動配料功能。表示put的Future可以位於自動分配器的隊列中,並且@ ndb.toplevel裝飾器是唯一可靠的方法(除了顯式調用get_result())以確保坐在這樣的隊列中的所有put請求都被髮送到服務器。 – 2012-07-24 19:17:14