是否可以在Google Cloud Datastore中执行阻塞的get()调用?

问题描述 投票:0回答:1

我有一项需要以下操作:

  1. 使用Google Cloud Datastore从密钥获取实体
  2. 执行资源(CPU /内存)密集型工作约10秒
  3. 使用Google Cloud Datastore中的结果更新实体

理想情况下,如果在处理#2的过程中已经有另一个工作人员,我甚至不希望程序开始执行#2。

这意味着get()调用将阻塞,直到没有其他人正在处理#2。

[我对docs的理解并尝试了数据存储区的Transaction,是直到commit()调用之后,才会进行任何争用检查。只有这样,才会引发错误并发生回滚。但这意味着每个工人都要执行昂贵的步骤#2,然后才意识到外面已经有人在做这项工作。

如果其他人有使用该键的交易,是否有办法让get()调用阻塞?

this article中,他们利用了内存缓存。但是,我希望尽可能将其保留在Cloud Datastore中,以最大程度地减少其他基础架构。

python multithreading google-cloud-platform google-cloud-datastore
1个回答
0
投票
事务的目标是准备写,然后在提交事务时有效地写,或者在回滚时取消更改。

未阻止读取,仅阻止了写入操作。

您对此有2个解决方案:

    例如,您必须将实体ID存储在内存存储中的某个位置。
  1. 您可以依靠您的处理持续时间来执行此过程

      获取实体
  2. 在您的实体(任何人)中写一个字段
  3. 设置写持续时间的超时,例如为500ms。 (用Go语言很容易,我不会用其他语言知道)。如果达到超时,则该实体上的事务已经在进行中,请跳过该实体。如果没有,请继续
  4. 创建交易
  5. 执行您的密集过程
  6. 写结果
  7. 提交交易
  • 但是,在两种情况下,如果同时出现,您仍然有比赛条件
  • © www.soinside.com 2019 - 2024. All rights reserved.