是否有内置或规范的方式按照完成顺序使用ndb.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
,但我从未使用它们。也许答案在于tasklet本身。
答案 0 :(得分:7)
这很简单 - 只需使用一套:
futures = set(futures)
while futures:
f = ndb.Future.wait_any(futures)
futures.remove(f)
yield f