Почему мои запросы и пакет не выполняются параллельно?
Исходя из документации для 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:
Кажется, причина этого в том, что Objectify не использует AsyncMemcacheService. Действительно, существует открытая проблема для этого на странице проекта, и это также можно подтвердить, проверив источник и выполнив grep -r AsyncMemcacheService
,
Что касается последовательных вызовов datastore_v3.RunQuery, то вызовы ofy(). Load(). Type(...). Filter(...). Iterable() являются "асинхронными" в том смысле, что они возвращаются немедленно, однако фактические запросы Datastore запрашиваются). сами выполняются последовательно, поскольку API хранилища данных App Engine не предоставляет явно асинхронный API для запросов.