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

Bin*_*yon 8 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修饰请求处理程序.这告诉处理程序在异步请求完成之前不要退出.这反过来让您发送请求,而不用担心结果.

Tak*_*suo 7

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

没有.

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

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

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

  • 澄清一下,推出可能不会发生的原因是NDB的自动批处理功能.表示put的Future可能位于自动批处理程序的队列中,而@ ndb.toplevel装饰器是唯一可靠的方法(除了显式调用get_result())以确保位于此类队列中的所有put请求都被发送到服务器. (3认同)