2013-03-31 24 views
6

谷歌App Engine的NDB提供了一個_post_put_hook(self, future),記載如下:該項目建成後()運行什麼時候ndb模型的_post_put_hook有一個與自己不同的未來?

要理解這一點鉤更好

胡克,我不知道什麼時候self將結果不同future的說法。

Model Hooks文檔提供:

如果使用後掛鉤異步API中,鉤子通過調用check_result(),get_result()或產生(一個tasklet內)異步方法的未來觸發。 Post鉤子不檢查RPC是否成功;無論失敗,掛鉤都會運行。

所有掛鉤在呼叫簽名末尾都有Future參數。這個Future對象包含這個動作的結果。你可以在這個Future上調用get_result()來檢索結果;你可以確定get_result()不會被阻塞,因爲Future被調用完成了。

然而,當我打電話put異步像這樣:

from google.appengine.ext import ndb 

class MyModel(ndb.Model): 
    xyz = ndb.StringProperty() 

    def _post_put_hook(self, future): 
     print "self.xyz: {}, future.xyz: {}".format(
      self.xyz, future.get_result().get().xyz)) 

m = MyModel() 
f = m.put_async() 
f.wait() 

m.xyz = 'abc' 
f = m.put_async() 
f.wait() 

輸出:

self.xyz: None, future.xyz: None 
self.xyz: abc, future.xyz: abc 

在 'put_async',我想的背景下人們可能會期望self到是修改前的模型,並且future是現在保存的模型。否則,目前還不清楚上下文中future的用途。

selffuture何時會在put的背景下有所不同?這裏的future的目的是什麼?

回答

10

我相信答案是在描述:

支柱鉤子不檢查RPC是否成功; 掛鉤 運行無論失敗

未來可以包含做一個put()時失敗的原因。通過使用鉤子,您可以使用這些知識來處理投入失敗的情況。例如,如果您的_post_put_hook負責根據模型的屬性增加關聯的SUM聚合模型,則可能會先嚐試檢查put是否成功,然後嘗試增加關聯的SUM聚合模型。我不相信selffuture.get_result().get()的價值會不一樣,只要RPC沒有失敗。

在此請求的put之後但在執行_post_put_hook之前,其他future.get_result().get(use_cache=False)可能會返回不同的值,所以總是有另一個請求更新模型的可能性。

+0

謝謝 - 這是豐富和有見地的。 –

相關問題