[英]ndb.put_multi_async with cloud ndb
Google cloud ndb 文档对异步操作的描述不多。
在过去,我会这样做
@ndb.toplevel
@flask.route('/', methods=['GET'])
def page():
for x in xxx:
ndb.put_multi_async([...])
return 'Done', 200
并且顶层装饰器将确保我的异步放置已完成。
我如何使用最新的 cloud ndb 执行此操作?
这个装饰器的使用在很大程度上是不必要的,因为你应该使用 context() ,它在退出上下文时也会刷新挂起的工作。
但如果能更清楚一点会很有帮助。 什么时候仍然需要使用顶层?
就个人而言,我一直习惯于在我的异步 tasklet/操作上调用.get_result()
,所以这是我从未实际使用过的东西。
对于toplevel
,我能想到的唯一用例是,如果您想在到达请求处理程序的末尾之前强制进行刷新(因为在请求处理程序的末尾,您应该退出上下文)。 在下面的示例中,我们希望 operation_1 中的放置在operation_1
开始之前operation_2
:
@ndb.toplevel
def operation_1():
for x in xxx:
ndb.put_multi_async([...])
@flask.route('/', methods=['GET'])
def page():
operation_1()
operation_2()
return 'Done', 200
这对于可以运行长达 10 分钟的 Google Cloud Tasks 的请求处理程序可能很有用,因此您可以在那里做很多事情。
正如NDB 异步操作文档中所述:
为方便起见,您可以使用
@ndb.toplevel
装饰请求处理程序。 这告诉处理程序在其异步请求完成之前不要退出。 ... 使用toplevel
应用程序比其所有处理函数更方便。
正如您所说,将NDB 客户端库与 Python 2 一起使用时,这很方便:
顶层装饰器将确保我的异步放置已完成
现在使用Cloud NDB 库,如这个答案所示,
每个导航台操作都需要包装在上下文管理器中:
with ndb_client.context(): # <- you need this line cls.get_or_insert('master')
这就是为什么文档说使用顶层装饰器
在很大程度上是不必要的,因为您应该使用 context()
因为上下文装饰器替换了它,它会
刷新挂起的 work_ 作为异步操作。
如Client
NDB 文档中所述:
上下文用于管理与 Google Cloud Datastore 的连接、异步 API 调用的事件循环、运行时缓存策略和其他基本运行时 state。
最后,如ndb
迁移说明中所述:
最大的区别在于为 NDB 应用程序建立运行时上下文。 Google App Engine Python 2.7 运行时有一个强有力的假设,即所有代码都在 web 框架请求-响应周期内执行,每个请求在一个线程中。 为了脱离该假设,Cloud NDB 实现了显式客户端和上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.