在应用引擎中,您可以像这样查询实体:
from django.db.models import Q
threshold = {
'hot': Q(post_upvotes__gt=50),
'trending': Q(post_upvotes__range=(20,50)),
'new': Q(post_upvotes__lt=20)
}
return Post.objects.filter(threshold[section])
执行此操作时,ndb代码负责有效地批量获取实体,以最大限度地减少到数据存储的往返。
在我的情况下,我想做同样有效的批处理,但我已经有了一个键列表,所以我不妨使用它们来避免较慢的查询。我想这样做:
for x in MyEntity.query().iter():
x.do_something()
函数for x in iter_entities(key_list):
x.do_something()
将根据需要批量获取实体。我自己写这篇文章并不难,但我可能无法像谷歌那些伟大的人那样做,如果我不需要,为什么要重新发明轮子呢?
有没有办法编写一个构建在ndb迭代器之上的函数iter_entities()
?
答案 0 :(得分:2)
如果您为个人实体处理使用异步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)