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)
在 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)