2

TL;DR:

Appengine でこのバグを回避するにはどうすればよいis_shutting_downですか?

詳細

Google Appengine アプリケーション (Python) にバックエンド インスタンスがあります。バックエンド インスタンスはレポートを生成するために使用されますが、完了するまでに数分から数時間かかることもあります。

予期しないシャットダウンに対処するために、True が返さruntime.is_shutting_down()れたときにレポートの中間状態を監視して DB に保存しています。is_shutting_down

これが私がチェックするコードの部分です:

from google.appengine.api import runtime

#...

def my_report_function():
    #...
    # Check if we should interrupt and reschedule to avoid timeout error.
    duration_sec = time.time() - start
    too_long = MAX_SEC < duration_sec
    is_shutting_down = runtime.is_shutting_down()
    log.debug('Does this report iteration need to wrap it up soon? '
              'Too long? %s (%s sec). Shutting down? %s'
               % (too_long, duration_sec, is_shutting_down))
    if too_long or is_shutting_down:
        # save the state of report, reschedule next iteration, and return

うまくいくこともありますが、Appengine のログに次のように表示されることがあります。

D 2013-06-20 18:41:56.893 Does this report iteration need to wrap it up soon? Too long? False (348.865950108 sec). Shutting down? False 
E 2013-06-20 18:42:00.248 Process terminated because the backend took too long to shutdown.

runtime.is_shutting_down()によって返された値を確認してから、Appengine がバックエンドを強制終了するまでの間に、30 秒のタイムアウトが経過していないことは明らかです。

これがなぜ起こっているのか、そしてこれに対する回避策があるかどうかを誰かが知っていますか?

前もって感謝します!

4

1 に答える 1

1

ここに Google IO のデモ コードがありますhttp://backends-io.appspot.com/

含まれている counter_v3_with_write_behind.py は、パターンを示しています。

'/_ah/start'経由でシャットダウンフックを設定する

runtime.set_shutdown_hook(something_to_save_progress_and_requeue_task)

あなたのコードは「今シャットダウンしていますか?そうでない場合は、しばらく時間がかかるかもしれないことをしてください」のようです。このパターンは、「できるだけ早くシャットダウンしないとすべてを失う」ことをリッスンする必要があります。

于 2013-06-27T12:40:11.883 に答える