GAE Python NDB .put在开发时不同步(但在生产中工作)?

use*_*036 1 python google-app-engine app-engine-ndb google-cloud-datastore

下面的代码应创建一个Counter模型并使用(延迟)任务将计数器增加到10.访问时'/'应该创建一个单独的Counter对象count = 10.这在生产中发生.在开发(localhost)Counter中,创建了多个对象,其中最大的对象为10:

在此输入图像描述

我怀疑这是因为put开发时不同步(但似乎总是在生产中).有没有办法让它们同步?

以下代码段:

class Counter(ndb.Model):
  count = ndb.IntegerProperty(indexed=False)

def reset():
  ndb.delete_multi(Counter().query().fetch(keys_only=True, use_cache=False, use_memcache=False))

def increment():
  counter = Counter().query().get(use_cache=False, use_memcache=False)
  if not counter:
    counter = Counter(count=0)

  counter.count += 1
  counter.put()

  if counter.count < 10:
    deferred.defer(increment)

@app.route('/')
def hello():
  """Return a friendly HTTP greeting."""
  reset()
  deferred.defer(increment)
  return 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

我有一个git repo,可以在这里重现这种行为.您可以在此处找到进行最后更改的提交.

Dan*_*scu 7

生产"同步性"很明显,不能保证(在您的方法中).总是会发生在查询中找不到新创建的计数器,因此您的代码可能会创建多个计数器.

有关Google Cloud Datoreore的平衡强大和最终一致性的更多详细信息.

  • 为了进一步解释,在生产中最终的一致性意味着查询*可能不会*(但可能会)包含新创建的项目.在开发中,有意夸大了这种效果,使得查询肯定不会包含新项目; 这是为了鼓励你处理这种可能性. (4认同)