我的程序依赖于 NDB 上下文缓存,因此不同的 ndb.Key.get() 调用将接收相同的模型实例。
但是,我发现这不适用于异步获取。预期的行为是 NDB 的批处理器组合请求并返回相同的模型实例,但这不会发生。
仅当启用 memcache 时才会出现此问题,这也很奇怪。
这是一个测试用例(运行两次):
class Entity(ndb.Model):
pass
# Disabling memcache fixes the issue
# Entity._use_memcache = False
entity_key = ndb.Key('Entity', 1)
# Set up entity in datastore and memcache on first run
if not entity_key.get():
entity = Entity(key=entity_key)
entity.put()
return
# Clear cache after Key.get() above
ndb.get_context().clear_cache()
# Entity is now in memcache and datastore but not context
entity_future_a = entity_key.get_async()
entity_future_b = entity_key.get_async()
entity_a = entity_future_a.get_result()
entity_b = entity_future_b.get_result()
# FAILS
assert entity_a is entity_b
到目前为止,我只在本地 SDK 上对此进行了测试。