是否存在一种内置或规范的方式来按照其完成顺序使用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似乎有一些奇特的(阅读:未记录)的可能性,例如ReducingFutureMultiFuture,但我从未使用过它们。也许答案在于小任务本身。

最佳答案

这很简单-只需使用一组即可:

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

10-08 12:33