是否存在一种内置或规范的方式来按照其完成顺序使用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
以查看是否完成。有一个固有的竞争条件:如果任何 future 同时完成,或者无论如何在
remove
调用之前完成,则可以完成futures
的多个元素。否则,我不知道确定消耗哪个 future 的可靠方法。有人希望这是一种很常见的模式,但是我还没有看到它解决。浏览
ndb/tasklets.py
似乎有一些奇特的(阅读:未记录)的可能性,例如ReducingFuture
或MultiFuture
,但我从未使用过它们。也许答案在于小任务本身。 最佳答案
这很简单-只需使用一组即可:
futures = set(futures)
while futures:
f = ndb.Future.wait_any(futures)
futures.remove(f)
yield f