Google Datastore 中使用游标的多线程

标签 multithreading google-app-engine google-cloud-datastore cursors

我想从 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/

相关文章:

android - 如何在android中具有一对一或一对多关系的对象化实体中插入记录

python - 为什么这段 python 代码不是线程安全的?

c++ - 条件变量和共享互斥量

java - 方法中仅运行单线程

python - 如何从 Google App Engine 发布文件?

python - SQLAlchemy 可以与 Google Cloud SQL 一起使用吗?

java - 按键排序 - 对象化

c# - 异步调用是需要在当前进程中多出一个线程还是使用线程池中的另一个线程?

python - 附加来自 Google 云端硬盘的文件

python - 优化应用引擎实体 key 的使用