GAE:后端实例上的任务在没有警告的情况下被杀死

时间:2013-06-21 01:57:19

标签: python google-app-engine timeout backend

TL; DR:

如何解决Appengine中的这个错误:有时候is_shutting_down会返回False,而在一两秒内,实例会被关闭?

详细

我在Google Appengine应用程序(Python)上有一个后端实例。后端实例用于生成报告,有时需要几分钟甚至几小时才能完成。

为了处理意外停机,我正在关注runtime.is_shutting_down()并在is_shutting_down返回True时将报告的中间状态存储到数据库中。

以下是我检查代码的部分:

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秒的超时。

有没有人知道为什么会这样,以及是否有解决方法?

提前谢谢!

1 个答案:

答案 0 :(得分: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)

看起来你的代码是“你现在正在关闭,如果没有,去做一些可能需要一段时间的事情”。这种模式应该听“尽快关闭或者你失去一切”。