繁体   English   中英

ndb.put_multi_async 与云 ndb

[英]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 执行此操作?

顶层的云 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM