Skip to main content
 首页 » 编程设计

python之GAE Python NDB .put 在开发上不同步(但在生产中有效)

2025年05月04日12think

下面应该创建一个 Counter 模型并使用(延迟的)任务将计数器递增到 10。访问 '/' 应该创建一个 count = 10 的 Counter 对象。这发生在生产中。在开发中(本地主机)创建了多个 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!' 

我有一个重现此行为的 git 存储库 here .您可以找到进行最后更改的提交 here .

请您参考如下方法:

生产“同步性”是显而易见的,不能保证(在您的方法中)。在查询中找不到新创建的计数器的情况总是会发生,因此您的代码可能会创建多个计数器。

此 Balancing Strong and Eventual Consistency with Google Cloud Datastore 中有更多详细信息文章。