0

В приложении двигатель, вы можете запросить объекты, как это:GAE/P: Эффективное извлечение большого количества предприятий по ключевому

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

Когда вы сделаете это, то код ОПРСА заботится о эффективных выборках объектов в пакетах с минимизировать поездки в хранилище данных.

В моей ситуации я хотел бы сделать то же самое эффективное дозирование, но у меня уже есть список ключей, поэтому я мог бы использовать их, чтобы избежать медленных запросов. Я хотел бы сделать это:

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

Если функция iter_entities() будет получать объекты в партиях, как я нуждаюсь в них. Не так уж сложно написать это сам, но я, вероятно, не могу сделать это так же хорошо, как великие люди в Google, и зачем изобретать колесо, если мне это не нужно!

Есть ли способ написать функцию iter_entities(), которая построена поверх итератора ndb?

ответ

2

Если вы используете асинхронные тасклеты для вашей обработки индивидуально-объекта, то 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) 
+0

Спасибо, что выглядит идеально. Автоматическое дозирование отличное. В моем 'do_something()', я буду ставить задачи с 'taskqueue.Queue(). Add()'. Знаете ли вы, может ли авто-дозатор их выгружать? –

 Смежные вопросы

  • Нет связанных вопросов^_^