2012-07-23 15 views
7

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でリクエストハンドラを飾ることができます。これは、非同期要求が完了したときに終了するようにハンドラに指示します。これにより、結果としてあなたは のリクエストを送信でき、結果は心配する必要はありません。

答えて

7

ndbリクエストが完了する前にアプリケーションリクエストが完了しても、ndbリクエストは終了することが保証されますか?

これは、そのかかわらず、単にNDB要求が実行されていることを確認するために、とにかく呼び出す必要がfuture.get_result結果についてのかどうか、ユーザーのケアのことを意味していますか?

基本的にはyesですが、結果を明示的に待つ必要がないように、ndb.toplevelデコレータを使用することができます。つまり、私はこれがあなたが望むものだとは思わない。

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

+3

明確にするために、putが実行されない理由はNDBの自動バッチング機能です。 putを表すFutureは自動バッチャーのキューに置かれ、@ ndb.toplevelデコレータは、(get_result()を明示的に呼び出す以外に)唯一の確実な方法です。サーバ。 –

1

ありがとうございます。 memcache.Client()のincr_async()など一般的なRPC(非NDB)はどうでしょうか?これが非常に速いRPC呼び出しであることを除いて、RPCが完了することが保証されていますか?

I.e.、真で次のどの:

(a)の要求

を完了する前に、すべての既知のRPC上で待機しますインフラの中で何かがある(b)の要求が完了し、非同期RPCはまた、完了しますかかわらず、要求が

(c)を完了したときの飛行中のRPCは、正式に他の

(d)に何かをキャンセルしていますか?

+1

このような更新をコメント、質問の編集、または新しい質問として投稿してください - 回答のみを回答として投稿してください。 –

+1

あなたの質問に対する答えは、(a)です。 –

関連する問題