6

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

在 put() 之后运行的钩子

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

模型挂钩文档提供:

如果你使用带有异步 API 的后挂钩,挂钩会通过调用 check_result()、get_result() 或产生(在 tasklet 中)异步方法的未来来触发。Post hook 不检查 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上下文中会有什么目的。

在 a 的上下文中什么时候会self和不同?来这里的目的是什么?futureputfuture

4

1 回答 1

12

我相信答案在描述中:

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

未来可以包含在执行put(). 您可以使用此知识通过使用挂钩来处理放置失败的情况。例如,如果您_post_put_hook负责根据模型的属性递增关联的 SUM 聚合模型,它可以先检查是否put成功,然后再尝试递增关联的 SUM 聚合模型。只要 RPC 没有失败,我不相信它的价值self并将永远不同。future.get_result().get()

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

于 2013-04-01T13:17:26.437 回答