ndbを使用してアプリケーション要求ごとにデータを記録するプロファイリングモデルを作成しています。各リクエストはndb.put_asyncによってndbリクエストを呼び出してデータを記録しますが、クライアントは結果を気にしません。本質的に、私は、アプリケーション要求がプロファイリングのための統計データの保存を待つことを望まない。ndb asyncは、アプリケーション要求が完了した後に実行することを保証していますか?
しかし、私は公式のドキュメントからの説明について混乱していました。 ndbリクエストが終了する前にアプリケーションリクエストが終了しても、ndbリクエストは終了することが保証されますか?ドキュメントは、要求ハンドラが早すぎる存在
場合、プットは、これは何が起こるかの基準で
を決して起こらないかもしれないことを示していますか?これは、ユーザが結果を気にするかどうかにかかわらず、ndbリクエストが確実に実行されるようにfuture.get_resultを呼び出す必要があることを意味しますか?
元のドキュメント(https://developers.google.com/appengine/docs/python/ndb/async)はこう述べています。この例では
、それはfuture.get_resultを呼び出すために少し愚かだ: アプリケーションはNDBからの結果を使用することはありません。そのコードはちょうどそこにあります。 NCRが を終了する前に要求ハンドラが終了していないことを確認するには、リクエストハンドラがあまりに早く終了すると、putは決して になることはありません。便宜上、 @ ndb.toplevelでリクエストハンドラを飾ることができます。これは、非同期要求が完了したときに終了するようにハンドラに指示します。これにより、結果としてあなたは のリクエストを送信でき、結果は心配する必要はありません。
明確にするために、putが実行されない理由はNDBの自動バッチング機能です。 putを表すFutureは自動バッチャーのキューに置かれ、@ ndb.toplevelデコレータは、(get_result()を明示的に呼び出す以外に)唯一の確実な方法です。サーバ。 –