8

ndbを使用して、アプリケーションリクエストごとにデータをログに記録するプロファイリングモデルを作成しています。各リクエストはndb.put_asyncによるndbリクエストを呼び出してデータをログに記録しますが、クライアントは結果を気にしません。本質的に、私はアプリケーション要求がプロファイリングのために統計データを保存するのを待つことを望まない。

しかし、公式資料からの説明に戸惑いました。ndbリクエストが終了する前にアプリケーションリクエストが終了した場合でも、ndbリクエストは確実に終了しますか?ドキュメントは次のことを示しています

リクエストハンドラーの存在が早すぎると、プットが発生しない可能性があります

これはどのような基準で起こりますか?これは、ユーザーが結果を気にするかどうかに関係なく、ndb要求が実行されることを確認するためだけに、とにかくfuture.get_resultを呼び出す必要があることを意味しますか?

元のドキュメント(https://developers.google.com/appengine/docs/python/ndb/async)には次のように書かれています。

この例では、future.get_resultを呼び出すのは少しばかげています。アプリケーションがNDBからの結果を使用することはありません。そのコードは、NDBプットが終了する前にリクエストハンドラーが終了しないようにするためのものです。リクエストハンドラの終了が早すぎると、プットが発生しない可能性があります。便宜上、リクエストハンドラを@ndb.toplevelで装飾できます。これは、非同期要求が終了するまで終了しないようにハンドラーに指示します。これにより、リクエストを送信し、結果を気にする必要がなくなります。

4

2 に答える 2

7

ndbリクエストが終了する前にアプリケーションリクエストが終了した場合でも、ndbリクエストは確実に終了しますか?

いいえ。

これは、ユーザーが結果を気にするかどうかに関係なく、ndb要求が実行されることを確認するためだけに、とにかくfuture.get_resultを呼び出す必要があることを意味しますか?

基本的にはそうですが、結果を明示的に待つ必要がないように、便宜上ndb.toplevelデコレータを使用できます。とはいえ、これはあなたが望んでいることではないと思います。

おそらくタスクキューはあなたが望むものです。チェックアウトしてください。

于 2012-07-24T02:19:40.180 に答える
1

説明してくれてありがとう。一般的なRPC(非NDB)についてはどうですか?たとえば、memcache.Client()のincr_async()ですか?これが非常に高速なRPC呼び出しであることは別として、RPCが完了することが保証されていますか?

つまり、次のうち正しいものはどれですか。

(a)インフラストラクチャには、リクエストを完了する前にすべての既知のRPCを待機するものがあります

(b)リクエストが完了すると、リクエストがいつ完了するかに関係なく、非同期RPCも完了します。

(c)実行中のRPCは正式にキャンセルされます

(d)何か他のもの?

于 2012-07-24T19:50:16.383 に答える