启用memcache时,NDB不会为异步获取返回相同的实例

时间:2013-09-19 15:50:20

标签: google-app-engine app-engine-ndb

我的程序依赖于NDB上下文缓存,因此不同的ndb.Key.get()调用将接收相同的模型实例。

但是,我发现这对异步获取不起作用。预期的行为是NDB的batcher组合请求并返回相同的模型实例但不会发生。

仅在启用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上测试了这个。

1 个答案:

答案 0 :(得分:1)

有可能发生这种情况,因为你没有在那里调用收益率。您可以尝试设置环境以便使用

entity_a, entity_b = yield entity_future_a, entity_b_future