3

Sur la base de la documentation Objectify et Google Cloud Datastore, j'attendre les requêtes et les charges de traitement par lots dans le code suivant pour exécuter en parallèle:Pourquoi mes requêtes et batch ne sont-ils pas exécutés en parallèle?

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(); 

Mais la trace fait ressembler à chaque requête et chaque entité charge exécute en séquence:

Trace

Qu'est-ce qui se passe?

Répondre

2

Il semble que cela ne se produise que lorsque vous faites un cache depuis Memcache. Avec un code similaire, je vois le comportement attendu pour async datastore_v3.Get/Put/Supprimer:

datastore_v3.Get datastore_v3.Put datastore_v3.Delete

Il semble que la raison en est que Objectify n'utilise pas AsyncMemcacheService. En effet, il y a un open issue pour ceci sur la page de projet, et ceci peut également être confirmé en vérifiant la source et en faisant un grep -r AsyncMemcacheService. En ce qui concerne les appels série datastore_v3.RunQuery, les appels à ofy(). Load(). Type (...). Filter (...). Iterable() sont 'asynchrones' en ce sens qu'ils sont return immediately Les requêtes de magasin de données elles-mêmes sont exécutées en série sous la forme de l'API App Engine Datastore doesn't expose an explicitly async API for queries.