2

以下递归函数无限循环,因为 f.done() 永远不会返回 true。为什么 .done() 永远不会返回 true?

        def check(f):
            if f.done():
                logging.info(f.get_result())
            else:
                check(f)

        f = ndb.Key(Entity, 'id').get_async()
        #loops forever
        check(f)
4

2 回答 2

3

使未来“完成”的代码永远不会有机会运行,因为您永远不会从任务中屈服,也不会在任何事情上调用 get_result() 或 wait()。

NDB 的异步处理不使用线程——它将代码交错在单个线程中,并且仅在进行某些调用(例如 wait()、get_result() 或 yield )时在任务之间切换。

于 2012-11-30T16:05:09.110 回答
1

这似乎不可能永远循环。最多循环60 秒,这是该方法的默认等待时间参数get_async

此外,除非这是一个相当简单的示例来说明一点,否则您的递归是不必要的。该get_result方法将为您完成所有这些工作,将其包装在 a 中try - except并在查询不成功时捕获异常。

get_result() - 必要时等待;然后返回结果或引发异常。

于 2012-11-29T11:00:26.740 回答