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.
当将self与future在的背景下不同put?这里的目的是future什么?
som*_*ne1 11
我相信答案在描述中:
Post hooks不检查RPC是否成功; 无论失败如何,钩子都会运行.
未来可以包含做某事时失败的原因put().您可以使用此知识来处理put何时使用钩子失败.例如,如果您_post_put_hook负责基于模型的属性递增关联的SUM聚合模型,则可以put在尝试递增关联的SUM聚合模型之前首先检查是否成功.我不相信的价值self和future.get_result().get()将永远是不同的,只要RPC没有失败.
在该请求之后put但在_post_put_hook执行之前,总有可能另一个请求更新模型,其中future.get_result().get(use_cache=False)可能返回不同的值.
| 归档时间: |
|
| 查看次数: |
2440 次 |
| 最近记录: |