ndb async"产生下一个#34;消耗get_multi异步

时间:2014-04-04 12:31:59

标签: python google-app-engine app-engine-ndb

是否有内置或规范的方式按照完成顺序使用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查看似乎有一些异国情调(阅读:未记录的)可能性,如ReducingFutureMultiFuture,但我从未使用它们。也许答案在于tasklet本身。

1 个答案:

答案 0 :(得分:7)

这很简单 - 只需使用一套:

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