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
的上下文中,future
和put
何时会有所不同?这里future
的目的是什么?
答案 0 :(得分:11)
我相信答案在说明中:
Post hooks不检查RPC是否成功; 钩子 无论失败都会运行。
未来可能包含执行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)
可能会返回不同的值。