我正在使用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。这告诉处理程序不要退出直到它 异步请求已完成。这反过来让你发送 请求而不用担心结果。
答案 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)别的什么?