2014-04-04 5 views
5

Gibt es eine eingebaute oder kanonische Methode, um die ersten und alle aufeinanderfolgenden Ergebnisse für einen ndb.get_multi_async Aufruf in der Reihenfolge ihrer Fertigstellung zu konsumieren?ndb aysnc "yield next" zu verbrauchen get_multi_async

Ich würde zu erwarten, und dies zeigt, es entlang der Linien von:

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)): 
    ... 

Eine Möglichkeit, die Zukunft verbraucht zu entfernen, ist futures zu überprüfen, um zu sehen, ob es gemacht wird. Es ist eine Race-Bedingung inhärent: Wenn alle Futures gleichzeitig oder in jedem Fall vor dem remove Aufruf abgeschlossen sind, können mehrere Elemente von futures getan werden. Mir ist sonst keine zuverlässige Möglichkeit bekannt, welche Zukunft verbraucht wurde.

Man würde erwarten, dass dies ein ziemlich häufiges Muster ist, aber ich habe es nicht gelöst gesehen. Wenn man durch ndb/tasklets.py schaut, scheint es einige exotische (lies: undokumentierte) Möglichkeiten wie ReducingFuture oder MultiFuture zu geben, aber ich habe sie nie benutzt. Vielleicht liegt die Antwort bei den Tasklets selbst.

Antwort

7

Es ist einfach - nur einen Satz verwenden:

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