什么时候ndb Model的_post_put_hook的未来与self不同?

时间:2013-03-31 19:24:57

标签: google-app-engine app-engine-ndb

Google App Engine的ndb提供_post_put_hook(self, future),记录如下:

  

在put()

之后运行的钩子

为了更好地理解这个钩子,我想知道self何时与future参数的结果不同。

Model Hooks文档提供:

  

如果使用带有异步API的后挂钩,则通过调用check_result(),get_result()或让(在tasklet内部)异步方法的未来来触发挂钩。 Post hooks不检查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上下文中put的目的是什么。

self的上下文中,futureput何时会有所不同?这里future的目的是什么?

1 个答案:

答案 0 :(得分:11)

我相信答案在说明中:

  

Post hooks不检查RPC是否成功; 钩子   无论失败都会运行

未来可能包含执行put()时失败的原因。您可以使用此知识来处理put何时使用钩子失败。例如,如果您的_post_put_hook负责根据模型的属性递增关联的SUM聚合模型,那么在尝试递增关联的SUM聚合模型之前,它可以首先检查put是否成功。我不相信selffuture.get_result().get()的价值会有所不同,只要RPC没有失败。

在此请求的put之后但_post_put_hook执行之前,其他请求始终可能会更新模型,其中future.get_result().get(use_cache=False)可能会返回不同的值。