是否保证在应用程序请求完成后执行ndb async?

时间:2012-07-23 22:11:26

标签: google-app-engine

我正在使用ndb编写一个分析模型,该模型记录每个应用程序请求的一些数据。每个请求都通过ndb.put_async调用ndb请求来记录数据,而客户端不关心结果。本质上,我不希望应用程序请求等待保存统计数据以进行性能分析。

但是,我对官方文档中的解释感到困惑。如果在ndb请求完成之前应用程序请求已完成,那么是否仍能保证ndb请求完成?文件表明

  

如果请求处理程序过早存在,那么put可能永远不会发生

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

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

  

在这个例子中,调用future.get_result有点傻了   应用程序从不使用NDB的结果。那段代码就在那里   确保请求处理程序在NDB放置之前不会退出   饰面;如果请求处理程序退出得太早,则put可能永远不会   发生。为方便起见,您可以使用装饰请求处理程序   @ ndb.toplevel。这告诉处理程序不要退出直到它   异步请求已完成。这反过来让你发送   请求而不用担心结果。

2 个答案:

答案 0 :(得分:7)

  

如果应用程序请求在ndb请求完成之前完成,那么是否仍然可以保证ndb请求完成?

没有

  

这是否意味着无论用户是否关心结果,都需要调用future.get_result,以确保执行ndb请求?

基本上是的,但您可以使用ndb.toplevel装饰器以方便,这样您就不必显式等待结果。也就是说,我认为这不是你想要的。

可能taskqueue就是你想要的。请检查一下。

答案 1 :(得分:1)

感谢您的澄清。一般RPC(非NDB)怎么样 - 例如,memcache.Client()中的incr_async()?抛开这是一个非常非常快速的RPC调用,是否保证RPC将完成?

即,以下哪一项是正确的:

(a)在完成请求之前,基础架构中有一些东西会等待所有已知的RPC

(b)请求将完成,异步RPC也将完成,无论请求何时完成

(c)飞行中的RPC正式取消

(d)别的什么?