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
是现在保存的模型。否则,future
在put
上下文中的作用就不清楚了。
self
和future
在put
上下文中什么时候不同?future
在这里的目的是什么?
我相信答案在描述中:
Post钩子不检查RPC是否成功;.
future可以包含执行put()
时失败的原因。您可以通过使用钩子来处理put失败的情况。例如,如果您的_post_put_hook
负责根据模型的属性增加关联的SUM聚合模型,那么在尝试增加关联的SUM聚合模型之前,它可以首先检查put
是否成功。我不相信self
和future.get_result().get()
的值会有什么不同,只要RPC没有失败。
总是有另一个请求在此请求的put
之后但在_post_put_hook
执行之前更新模型的可能性,其中future.get_result().get(use_cache=False)
可能返回不同的值。