Эффективный способ запроса в цикле for в Google App Engine?

В документации GAE говорится:

Поскольку каждая операция get () или put () вызывает отдельный удаленный вызов процедуры (RPC), выдача многих таких вызовов внутри цикла является неэффективным способом обработки коллекции сущностей или ключей одновременно.

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

for friend_dic in friends: email = friend_dic['email'] lastUpdated = friend_dic['lastUpdated'] userKey = Key('User', email) query = ndb.gql('SELECT * FROM StatusUpdates WHERE ANCESTOR IS :1 AND modifiedDate > :2', userKey, lastUpdated) qit = query.iter() while (yield qit.has_next_async()): status = qit.next() status_list.append(status.to_dict()) raise ndb.Return(status_list) 

Есть ли более эффективный способ сделать это, возможно, каким-то образом пакет все это в один запрос?

2 Solutions collect form web for “Эффективный способ запроса в цикле for в Google App Engine?”

Попробуйте найти функцию карты NDB: https://developers.google.com/appengine/docs/python/ndb/queryclass#Query_map_async

Пример (предполагая, что вы поддерживаете отношения своих друзей в отдельной модели, для этого примера я предположил модель Relationships ):

 @ndb.tasklet def callback(entity): email = friend_dic['email'] lastUpdated = friend_dic['lastUpdated'] userKey = Key('User', email) query = ndb.gql('SELECT * FROM StatusUpdates WHERE ANCESTOR IS :1 AND modifiedDate > :2', userKey, lastUpdated) status_updates = yield query.fetch_async() raise ndb.Return(status_updates) qry = ndb.gql("SELECT * FROM Relationships WHERE friend_to = :1", user.key) updates = yield qry.map_async(callback) #updates will now be a list of status updates 

Обновить:

С лучшим пониманием вашей модели данных:

 queries = [] status_list = [] for friend_dic in friends: email = friend_dic['email'] lastUpdated = friend_dic['lastUpdated'] userKey = Key('User', email) queries.append(ndb.gql('SELECT * FROM StatusUpdates WHERE ANCESTOR IS :1 AND modifiedDate > :2', userKey, lastUpdated).fetch_async()) for query in queries: statuses = yield query status_list.extend([x.to_dict() for x in statuses]) raise ndb.Return(status_list) 

Вы можете выполнять эти запросы одновременно с помощью nintable-асинхронных методов:

 from google.appengine.ext import ndb class Bar(ndb.Model): pass class Foo(ndb.Model): pass bars = ndb.put_multi([Bar() for i in range(10)]) ndb.put_multi([Foo(parent=bar) for bar in bars]) futures = [Foo.query(ancestor=bar).fetch_async(10) for bar in bars] for f in futures: print(f.get_result()) 

Это запускает 10 параллельных RPC-запросов Datastore Query, и общая латентность зависит только от самого медленного, а не от суммы всех задержек

Также см. Официальную документацию ndb для более подробной информации о том, как асинхронные API с ndb.

  • parent-> дочерние отношения в appengine python (bigtable)
  • Python App Engine: используйте app.yaml для управления обработчиком URL
  • Ошибка импорта модуля Google Cloud Bigquery api в приложении python.
  • Как предотвратить вызов приложения datastore_v3.next () при вызове get_multi?
  • Нет реализации для Kind Exception Python Google App Engine
  • Включить Google + круги в движке приложения?
  • Эффективный способ сделать большой запрос IN в Google App Engine?
  • Доступ API Google Analytics без локального браузера в python
  • Есть ли способ защитить прототип хранилища конечных точек Google?
  • Как использовать хранилище данных с высокой репликацией
  • Как использовать метод delete () в обработчике запросов Google App Engine Python
  •  
    Interesting Posts for Van-Lav

    Структура данных для быстрого поиска GPS?

    запуск python manage.py вызывает ошибки

    Несколько доменов и многопользовательский каталог в том же приложении Django

    Регулярное выражение для группы захвата один или несколько раз

    Как ускорить итерацию больших наборов данных в Django

    Как нарезать numpy.ndarray, состоящий из numpy.void номеров?

    Как установить PyInstaller?

    Оценка математического выражения (функции) для большого количества входных значений быстро

    Я продолжаю получать эту ошибку для моей простой программы python: «TypeError: объект« float »не может быть интерпретирован как целое число»

    Неблокирующий метод для разбора (потоковой передачи) XML в python

    Есть встроенная функция идентификации в python?

    списки панд и групп

    Специальные символы в имени файла OSX? (Python os.rename)

    Как переписать рекурсивную функцию для использования цикла?

    python: как узнать индекс, когда вы произвольно выбираете элемент из последовательности с random.choice (seq)

    Python - лучший язык программирования в мире.