2014-04-04 16 views
5

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.

risposta

7

E 'facile - basta usare un set:

futures = set(futures) 
while futures: 
    f = ndb.Future.wait_any(futures) 
    futures.remove(f) 
    yield f