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 の非同期処理はスレッドを使用しません。コードを 1 つのスレッドにインターリーブし、wait()、get_result()、yield などの特定の呼び出しが行われたときにのみタスクを切り替えます。

于 2012-11-30T16:05:09.110 に答える
1

これが永遠にループする可能性はないようです。最大で60 秒間ループします。これは、メソッドのデフォルトの待機時間引数ですget_async

また、これがポイントを説明するための非常に単純な例でない限り、再帰は必要ありません。このメソッドはすべてのことを行い、クエリが成功しなかった場合はget_resultでラップし、例外をキャッチします。try - except

get_result() - 必要に応じて待機します。結果を返すか、例外を発生させます。

于 2012-11-29T11:00:26.740 に答える