我想从 Google 数据存储区加载大量数据。
因此,第 1 步:我运行查询(使用keysOnly=true)并循环游标,以便每个游标都指向包含 600 个对象的页面的开头。我将光标存储在局部变量中。
第 2 步:我为每个游标分派(dispatch)一个线程,在每个线程中加载和处理 600 个对象。
这不是游标的通常使用方式。
但是,对我来说,它看起来是正确的。步骤 1 和步骤 2 中的实际查询字符串是相同的。这类似于通常的无状态 Web 用例,用户可能会请求“下一步”、“后退”,然后重新加载上一页;游标不需要直接来自前一个游标查询的结果。
我不想按顺序单步执行游标,然后分离线程以便并行处理给定游标查询中加载的对象,因为我想并行化来自数据库的实际 IO 密集型查询。
我发现结果有些不一致,似乎涉及丢失页面和重复加载对象。这是从 Google Datastore 多线程加载大量数据的正确方法吗?或者如果不是,那是什么?
最佳答案
我会推荐一种不同的方法。仅运行一个循环遍历所有实体的查询。它发生得非常快(不要忘记将批量大小设置为 500,默认值只有 10)。如果查询很大,您仍然可能需要使用游标。
使用任务 API 为每个实体创建一个任务并将其添加到任务队列中。这些任务可以并行执行。您可以设置队列上的所有参数。
通过这种方法,您不必担心线程,您可以将任务设置为在失败时自动重试等等。我发现它是 App Engine 吸引力的一个非常重要的部分 - 只编写您自己的逻辑,让 App Engine 关心执行部分。
关于Google Datastore 中使用游标的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36451373/