У меня есть задание cron AppEngine, которое запрашивает хранилище данных, а затем нужно выполнить некоторую работу над каждым объектом, возвращаемым запросом. Ожидается, что количество объектов, возвращаемых запросом, будет иногда большим (> 1000).Можно ли использовать qry.map_async(), когда количество результатов запроса велико?
Моя цель - максимизировать параллелизм, а также поддерживать низкий уровень использования памяти - поскольку ожидаемое количество результатов велико, они могут не соответствовать памяти.
Учитывая большое # результатов, я должен перебрать их так:
qry = Model.query()
qit = qry.iter()
while (yield qit.has_next_async()):
entity = qit.next()
# Do something with entity
... или это безопасно использовать быстрее map_async() работать на сколь угодно большом наборе результатов?
@ndb.tasklet
def callback(entity):
# Do something with entity
qry = Model.query()
yield qry.map_async(callback)
Я прочитал все документы и даже посмотрел на кишках реализации, и это не совсем ясно, что ограничения этих операций для больших наборов результатов.
Использование «yield something_async()» не является чем-то большим, чем использование синхронного API, если ваш код не запущен в тасклете (в этом случае он все равно не будет работать быстрее, но другие вещи могут работать на одном и том же время). –
Кроме того, «> 1000» покрывает много. Это> 10 000? > 100000? > 1000000? В какой-то момент лучший подход меняется. –
Hi Nick, да мой код запущен в тасклете, и я понимаю, что это не совсем «быстрее», а позволяет одновременно запускать другие тасклеты. Спасибо за разъяснения. Что касается числа сущностей, я ожидаю, что число будет выше, чем, возможно, 10 000. –