2014-04-04 11 views
5

ndb.get_multi_async numaralı çağrı için ilk ve tüm ardışık sonuçları tamamlanma sırasına göre tüketmenin yerleşik veya kanonik bir yolu var mı?ndb aysnc "verim next" i tüketmek için get_multi_async

ben beklenir ve bu çizgisinde bunu göstermektedir: yapıldığını olup olmadığını görmek için futures kontrol etmek tüketilen geleceği kaldırmak için

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

Tek yoldur. doğasında bir yarış durumu vardır: Aynı anda veya remove aramadan önce her durumda tam herhangi vadeli, futures çoklu elemanlar olabilir Eğer yapılır. Aksi halde hangi geleceğin tüketildiğini belirlemenin güvenilir bir yolunun farkında değilim.

biri bu oldukça yaygın bir model olduğunu beklenebilir ancak Halledildi görmedim. ndb/tasklets.py içinden bakıldığında bazı egzotik (okuyun: belgesiz) görünmektedir ReducingFuture veya MultiFuture gibi olasılıklar, ama onları hiç kullanmamış. Belki de cevap, görevlerin kendileriyle ilgilidir.

cevap

7

Kolaydır - sadece bir dizi kullanın:

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