2012-01-14 23 views
3

私はダウンロード用のブロブストアにファイルを構築するための遅延タスクを作成しています。私は、ドキュメントに与えられた例のコードをモデリングしています:DeadlineExceededErrorがある場合、ハンドラは整頓し、継続して新しい延期タスクをキックオフすることができるようにアイデアは、コードを構造化することであるGoogle App EngineでDeadlineExceededError例外がスローされる場合

http://code.google.com/appengine/articles/deferred.html後で。

私が知りたいのは、この例外をスローすることができるのはいつですか?原子的であることが保証されているため、中断されない操作はありますか?

上記の例では、各レコードの処理が終了するとstart_keyという変数が更新されますが、to_putリストとto_deleteリストの間でメインループが中断され、データが間違っているとします削除のセットを逃してください。

例外が発生する可能性がある場合は、batch_writeの途中、またはdb_putとto_putリストのクリアの間にある可能性があります。

これはスレッドセーフティの問題と論理的に等価ですが、これは通常、原子操作と非アトミック操作を保証しています。

これはどのように機能しますか? A DeadlineExceededErrorは文字通りまったくの時間をスローすることができる

答えて

2

感謝。スローすることができない時があった場合、悪意のあるアプリはループ内でそのコードを単に実行することができます。あなたはこのいくつかの方法を避けることができ

:あなたは期限を打つ前に

  1. を積極的にあなたが実行してきたどのくらいチェックして、良い時間で停止。
  2. 最後に完了した操作の状態を格納できるように例外ハンドラを配置します(例外がスローされた外部ループの最後の反復以降に何かを破棄するなど)。
  3. バックエンドを使用します。期限はありません。
+0

お返事ありがとうございます。それは私が推測していたものですが、通常は、比較や交換に相当する原子操作があることを期待しています。これは通常、ループで実行されても中断される可能性があるため安全です。私はスクリプト言語ではそれが難しいことの一つだと思います。 – Jules

+0

私が私の場合に選択した解決策は、_target =引数を使用して、遅延タスクをバックエンドで実行することです。これはコストの爆発的な観点からは少し危険ですが、私のケースでは動作します。 – Jules

+0

クラス関数が呼び出されたとき、__exit__は、例外がそれを中断したときに呼び出されることが保証されています。 – Jules

関連する問題