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

Bri*_*unt 6 google-app-engine app-engine-ndb

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

在put()之后运行的钩子

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

型号钩文档提供:

如果使用带有异步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()
Run Code Online (Sandbox Code Playgroud)

输出:

self.xyz: None, future.xyz: None
self.xyz: abc, future.xyz: abc
Run Code Online (Sandbox Code Playgroud)

在"put_async"的背景下,我认为人们可能会想到self是修改前的模型,并future成为模型现在保存.否则,不清楚上下文future中的目的是什么put.

当将selffuture在的背景下不同put?这里的目的是future什么?

som*_*ne1 11

我相信答案在描述中:

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

未来可以包含做某事时失败的原因put().您可以使用此知识来处理put何时使用钩子失败.例如,如果您_post_put_hook负责基于模型的属性递增关联的SUM聚合模型,则可以put在尝试递增关联的SUM聚合模型之前首先检查是否成功.我不相信的价值selffuture.get_result().get()将永远是不同的,只要RPC没有失败.

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