有没有一种方法可以在Google Cloud Datastore中执行阻塞的get()调用?

时间:2020-06-10 17:12:37

标签: python multithreading google-cloud-platform google-cloud-datastore

我需要进行以下一项操作:

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

理想情况下,为了最大程度地减少资源使用,如果在处理#2的过程中已经有另一个工作人员,我甚至不希望程序开始执行#2。

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

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

如果其他人使用该密钥进行交易,是否有办法让get()呼叫阻塞?

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

1 个答案:

答案 0 :(得分:1)

事务的目标是准备写,然后在提交事务时有效地写,或者在回滚时取消更改。

读取不会被阻止,只有写入操作会被阻止。

您有2种解决方案:

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

    • 获取实体
    • 在您的实体(任何人)中写一个字段
    • 设置写持续时间的超时,例如为500ms。 (用Go语言很容易,我不会用其他语言知道)。如果达到超时,则该实体上的事务已经在进行中,请跳过该实体。如果没有,请继续
    • 创建交易
    • 执行密集过程
    • 写结果
    • 提交交易

但是,在两种情况下,如果同时出现,您仍然有比赛条件

相关问题