GAE ndb future.done()永远不会返回true

时间:2012-11-29 10:32:42

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

以下递归函数无限循环,因为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)

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

  

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