【发布时间】:2013-01-07 23:14:17
【问题描述】:
我正在使用后端使用ndb.put_multi(list_of_entities) 编写多个实体。
我遇到的问题是,在此之后,如果我进行查询,则不会得到任何结果。如果我设置一个睡眠定时器,例如 1 秒,我可以读取我刚刚编写的实体。
例如:
class Picture(ndb.Expando):
pass
class Favourite(ndb.Expando):
user_id = ndb.StringProperty(required=True)
pass
#...make lists with Picture and Favourite kinds
entities = favourites
entities[1:1] = pictures
ndb.put_multi(entities)
favourites = Favourite.query().filter(Favourite.user_id == user_id).fetch(99999, keys_only=True)
logging.info(len(favourites)) #returns 0 in dev_appserver why?
首先假设问题与缓存有关。 但是:
阅读NDB Entities Operations on Multiple Keys or Entities:
高级说明:这些方法与上下文正确交互,并且 缓存;它们不直接对应于特定的 RPC 调用。
上下文缓存
上下文缓存仅在单个持续时间内持续存在 传入的 HTTP 请求,并且仅对处理的代码“可见” 那个请求。它很快;这个缓存存在于内存中。当一个新开发银行 函数写入数据存储,它还写入上下文 缓存。当 NDB 函数读取实体时,它会检查上下文 先缓存。如果在那里找到实体,则没有 Datastore 交互 发生。
查询不会在任何缓存中查找值。但是,查询结果是 如果缓存策略这样写,则写回上下文缓存(但是 永远不要使用 Memcache)。
嗯,我在这里迷路了。一切似乎都很好。即使从控制台查询我得到正确的总和,但永远不会在同一个处理程序上,无论什么功能等。
我唯一注意到的是,当等待time.sleep(1) 时,我得到了正确的结果。因此,这与ndb.put_multi 可能无法同步完成有关。好迷茫……
【问题讨论】:
-
怀疑是这样的:stackoverflow.com/questions/12367904/…最终一致性。
-
是的,我也怀疑这个@PaulC,但后来我想错了。如果
put_multi()返回是否意味着实体已被放置并且索引和提交成功?我没有使用异步方法。 -
如果您不使用祖先查询或通过键获取实体,则会遇到最终一致性问题。如果您使用祖先查询或键来获取单个实体,那么它可能是别的东西。
-
Guido 不断提醒我,ndb 缓存仅缓存您通过 key/id 获取的实体。查询不会被缓存。由于您没有使用事务,因此您肯定会遇到最终一致性问题。
-
你也可以回答并接受你自己的问题 :)
标签: python google-app-engine app-engine-ndb