GAE / P:通过密钥有效地获取大量实体

时间:2015-11-01 15:55:39

标签: python google-app-engine google-cloud-datastore app-engine-ndb

在应用引擎中,您可以像这样查询实体:

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

1 个答案:

答案 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)
相关问题