2014-04-04 9 views
5

क्या ndb.get_multi_async कॉल के पूरा होने के क्रम में पहले और सभी लगातार परिणामों का उपभोग करने के लिए कोई अंतर्निहित या कैनोलिक तरीका है?ndb aysnc "उपज अगली" उपभोग करने के लिए get_multi_async

मैं उम्मीद होती है, और इस की तर्ज पर दिखाता है, यह भविष्य का सेवन को दूर करने के

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

एक तरीका यह है futures जांच करने के लिए यह किया है या नहीं। निस्संदेह एक रेस शर्त है: यदि कोई वायदा remove कॉल से पहले किसी भी मामले में या किसी भी मामले में पूरा होता है, तो futures के कई तत्व हो सकते हैं। मैं अन्यथा यह निर्धारित करने के लिए एक विश्वसनीय तरीका से अवगत नहीं हूं कि भविष्य का उपभोग किस प्रकार हुआ था।

कोई उम्मीद करेगा कि यह काफी आम पैटर्न है, लेकिन मैंने इसे हल नहीं किया है। ndb/tasklets.py के माध्यम से देख रहे हैं ReducingFuture या MultiFuture जैसे कुछ विदेशी (पढ़ा: अनियंत्रित) संभावनाएं प्रतीत होती हैं, लेकिन मैंने कभी उनका उपयोग नहीं किया है। शायद जवाब खुद को टास्कलेट के साथ निहित है।

उत्तर

7

यह आसान है - बस एक सेट का उपयोग:

futures = set(futures) 
while futures: 
    f = ndb.Future.wait_any(futures) 
    futures.remove(f) 
    yield f 
संबंधित मुद्दे