新开发银行模特的_post_put_hook什么时候有了与自己不同的未来?



Google App Engine的ndb提供了一个_post_put_hook(self, future),文档如下:

在put()之后运行的钩子

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

Model Hooks文档提供:

如果你在异步api中使用post-hooks,钩子是通过调用check_result(), get_result()或(在微线程中)生成异步方法的future来触发的。Post钩子不检查RPC是否成功;不管失败与否,钩子都会运行。

所有post- hook在调用签名的末尾都有一个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是现在保存的模型。否则,futureput上下文中的作用就不清楚了。

selffutureput上下文中什么时候不同?future在这里的目的是什么?

我相信答案在描述中:

Post钩子不检查RPC是否成功;.

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

总是有另一个请求在此请求的put之后但在_post_put_hook执行之前更新模型的可能性,其中future.get_result().get(use_cache=False)可能返回不同的值。

最新更新