2012-07-23 30 views
7

我正在使用ndb编写一个分析模型,该模型会记录每个应用程序请求的一些数据。每个请求都会通过ndb.put_async调用ndb请求来记录数据,而客户端不关心结果。实质上,我不希望应用程序请求等待保存用于分析的统计数据。ndb异步保证在应用程序请求完成后执行?

但是,我对官方文档的解释感到困惑。如果一个应用程序请求在ndb请求结束之前完成,ndb请求是否仍能保证完成?文档表示

如果请求处理程序太早存在,看跌期权可能永远不会发生

在这种情况会发生什么样的标准?这是否意味着无论用户是否关心结果,都需要调用future.get_result来确保ndb请求被执行?

的原始文件(https://developers.google.com/appengine/docs/python/ndb/async)说:

在这个例子中,这是一个有点傻叫future.get_result:在 应用程序从不使用从NDB结果。该代码仅在 以确保在NDB将 完成之前请求处理程序不会退出;如果请求处理器过早退出,则可能永远不会发生 。作为一种方便,您可以用 @ ndb.toplevel来装饰请求处理程序。这告诉处理程序不要退出,直到其异步请求完成 。这又可以让你发送 的请求,而不用担心结果。

回答

7

如果一个应用程序请求的NDB请求之前完成完成后,将在NDB请求还是可以保证的完吗?

这是否意味着,无论是否对结果的用户关怀,future.get_result需要被称为反正只是为了确保执行NDB要求?

基本上可以,但是您可以使用ndb.toplevel装饰器以方便您,无需等待显式结果。这就是说,我不认为这是你想要的。可能taskqueue是你想要的。请检查一下。

+3

为了澄清,可能不会发生的原因是NDB的自动配料功能。表示put的Future可以位于自动分配器的队列中,并且@ ndb.toplevel装饰器是唯一可靠的方法(除了显式调用get_result())以确保坐在这样的队列中的所有put请求都被发送到服务器。 – 2012-07-24 19:17:14

1

感谢您的澄清。关于一般RPC(非NDB) - 例如memcache.Client()中的incr_async()如何?抛开这一点,这是一个非常非常快速的RPC调用,是否可以保证RPC能够完成?

I.e.,下列哪项是正确的:

(一)有东西在基础设施,将等待上所有已知的RPC完成请求之前

(二)请求将完成与异步的RPC也将完成无论何时请求完成

(C)的飞行RPC是正式取消

(d)其他的东西?

+1

请发布这样的更新作为评论,编辑您的问题,或一个新的问题 - 只有答案应张贴为答案。 – 2012-07-27 05:31:46

+1

虽然你的问题的答案是(a)。 – 2012-07-27 05:32:30

相关问题