Почему мои запросы и пакет не выполняются параллельно?

Исходя из документации для Objectify и Google Cloud Datastore, я ожидаю, что запросы и пакетные загрузки в следующем коде будут выполняться параллельно:

List<Iterable<Key<MyType>>> results = new ArrayList<>();
for (...) {
  results.add(ofy().load()
      .type(MyType.class)
      .filter(...)
      .keys()
      .iterable());
}
...
Iterable<MyType> keys = ...;
Collection<MyType> c = ofy().load().keys(keys).values();

Но трассировка делает его похожим на каждый запрос, и каждая загрузка сущности выполняется по порядку:

след

Что дает?

1 ответ

Похоже, это происходит только при выполнении кэшированного получения из Memcache. С похожим кодом я вижу ожидаемое асинхронное поведение для datastore_v3.Get/Put/Delete:

datastore_v3.Get datastore_v3.Put datastore_v3.Delete

Кажется, причина этого в том, что Objectify не использует AsyncMemcacheService. Действительно, существует открытая проблема для этого на странице проекта, и это также можно подтвердить, проверив источник и выполнив grep -r AsyncMemcacheService,

Что касается последовательных вызовов datastore_v3.RunQuery, то вызовы ofy(). Load(). Type(...). Filter(...). Iterable() являются "асинхронными" в том смысле, что они возвращаются немедленно, однако фактические запросы Datastore запрашиваются). сами выполняются последовательно, поскольку API хранилища данных App Engine не предоставляет явно асинхронный API для запросов.

Другие вопросы по тегам