GAE/P: 通过键高效地获取大量实体

GAE/P: Efficiently fetching large number of entities by key

在 App Engine 中,您可以像这样查询实体:

for x in MyEntity.query().iter():
    x.do_something()

执行此操作时,ndb 代码负责高效地批量获取实体,以最大限度地减少到数据存储的往返行程。

在我的情况下,我想做同样高效的批处理,但我已经有了一个键列表,所以我不妨使用它们来避免较慢的查询。我想这样做:

for x in iter_entities(key_list):
    x.do_something()

函数 iter_entities() 将在我需要时分批获取实体。自己写这个并不难,但我可能做不到 Google 的那些伟大的人,如果不需要,为什么要重新发明轮子!

有没有办法编写一个构建在 ndb 迭代器之上的函数iter_entities()

如果您使用异步 tasklet 进行单个实体处理,那么 NDB 将负责批处理获取,像这样的事情应该可行:

@ndb.tasklet
def do_something(key):
  x = yield key.get_async()
  x.do_something()

futs = []
for key in key_list:
  futs.append(do_something(key))

ndb.Future.wait_all(futs)