以下递归函数无限循环,因为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)
答案 0 :(得分:3)
使未来“完成”的代码永远不会有机会运行,因为你永远不会从任务中屈服或者在任何事情上调用get_result()或wait()。
NDB的异步处理不使用线程 - 它在单个线程中交错代码,只在进行某些调用时在任务之间切换,例如wait(),get_result()或yield
答案 1 :(得分:1)
这似乎不可能永远循环。最多会循环 60秒,这是get_async
方法的默认等待时间参数。
此外,除非这是一个相当简单的例子来说明一点,否则你的递归是不必要的。 get_result
方法将为您完成所有这些操作,将其包装在try - except
中并在查询未成功时捕获异常。
get_result() - 必要时等待;然后返回结果或引发异常。