Esiste un modo incorporato o canonico per consumare il primo e tutti i risultati successivi per una chiamata ndb.get_multi_async
nell'ordine del loro completamento?ndb aysnc "resa successiva" per consumare get_multi_async
mi si aspetterebbe, e questo illustra, lungo le linee di:
def yield_next(futures):
while futures:
yield ndb.Future.wait_any(futures)
# We have to remove the yielded future from the futures.
# How do we know which future was removed?
# ... futures.remove(???)
for model in yield_next(ndb.get_multi_async(keys)):
...
Un modo per rimuovere il futuro consumata è di controllare futures
per vedere se è fatto. Esiste una condizione di competizione intrinseca: se un futuro viene completato contemporaneamente o in ogni caso prima della chiamata remove
, più elementi di futures
possono essere fatti. Altrimenti non sono a conoscenza di un modo affidabile per determinare quale futuro è stato consumato.
Uno si aspetterebbe che questo sia un modello abbastanza comune, ma non l'ho visto risolto. Guardando attraverso ndb/tasklets.py
sembrano esserci alcune possibilità esotiche (leggi: non documentate) come ReducingFuture
o MultiFuture
, ma non le ho mai usate. Forse la risposta si trova con gli stessi tasklet.