【问题标题】:GAE ndb future.done() never returns trueGAE ndb future.done() 永远不会返回 true
【发布时间】:2012-11-29 10:32:41
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这是一个简单的例子来说明一个观点。我仍然不明白为什么 f.done() 永远不会返回 True。显然,放入 wait() 或 get_result() 将得到结果,并且 done 将返回 True。但是为什么我需要在 .done() 返回 True 之前调用其中任何一个?这不是 .done() 的意义吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2016-02-08
      • 2020-02-27
      相关资源
      最近更新 更多