Python GAE更新应用程序,如何避免长过程的暴力停止?
我有一个GAE应用程序,它通过另一个模块(通过基本的扩展管理)生成一些长过程 这个长进程正确地处理DeadlineExceededError,但产生了一个延迟方法,该方法将保存长进程的当前状态,以便稍后恢复 今天我发现,当我做一个Python GAE更新应用程序,如何避免长过程的暴力停止?,python,google-app-engine,Python,Google App Engine,我有一个GAE应用程序,它通过另一个模块(通过基本的扩展管理)生成一些长过程 这个长进程正确地处理DeadlineExceededError,但产生了一个延迟方法,该方法将保存长进程的当前状态,以便稍后恢复 今天我发现,当我做一个appcfg.py-a update myapp/时,它突然停止了漫长的过程。停下来吧,没有死亡线(我的希望来了),什么都没有 在停止应用程序之前,GAE是否会触发一些事件,让我保存长进程的当前状态,将数据写入文件(通过s3,所以有点长),并重新排队等待稍后重新运行?(
appcfg.py-a update myapp/
时,它突然停止了漫长的过程。停下来吧,没有死亡线(我的希望来了),什么都没有
在停止应用程序之前,GAE是否会触发一些事件,让我保存长进程的当前状态,将数据写入文件(通过s3,所以有点长),并重新排队等待稍后重新运行?(或类似的事情)
感谢您的帮助。从中,手动和基本缩放的行为与实例相同:
与手动缩放一样,使用appcfg stop停止的实例
或从云平台控制台)有30秒的时间完成处理
强制终止前的请求
I假设更新应用程序时使用相同的关机方法
和来自:
应用程序有两种方法来确定是否需要手动缩放
实例即将关闭。首先,正在关闭
来自google.appengine.api.runtime的方法开始返回true。第二
(和首选),您可以注册关机挂钩,如下所述
当应用程序引擎开始关闭实例时,现有请求将被删除
给30秒时间完成,新请求立即返回404。
如果实例正在处理请求,应用程序引擎将暂停该请求
并运行关机挂钩。如果没有激活的请求,则应用程序引擎
发送/_ah/stop请求,该请求运行关闭挂钩。这个
/_ah/停止请求绕过正常处理逻辑,无法处理
按用户代码;它的唯一目的是调用shutdownhook。如果你
在处理另一个异常时,在关闭挂钩中引发异常
请求,它将冒泡到请求中,在那里您可以捕获它
如果通过指定threadsafe启用了并发请求:true
在app.yaml(默认值)中,从
shutdownhook将该异常复制到所有线程。下面的代码
示例演示了一个基本的关闭挂钩:
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import runtime
def my_shutdown_hook():
apiproxy_stub_map.apiproxy.CancelApiCalls()
save_state()
# May want to raise an exception
runtime.set_shutdown_hook(my_shutdown_hook)
或者,下面的示例演示如何使用
\u正在关闭\u()方法:
注意:重要的是要认识到关闭挂钩并不总是有效的
能够在实例终止之前运行。在极少数情况下,停机
可能会发生阻止App Engine提供30秒的
关机时间。因此,我们建议定期检查状态
并将其主要用作内存缓存,而不是
而不是可靠的数据存储
基于我上面的假设,我希望这些方法也适用于您的情况,请尝试一下。从中,手动和基本缩放的行为似乎与实例相同:
与手动缩放一样,使用appcfg stop停止的实例
或从云平台控制台)有30秒的时间完成处理
强制终止前的请求
I假设更新应用程序时使用相同的关机方法
和来自:
应用程序有两种方法来确定是否需要手动缩放
实例即将关闭。首先,正在关闭
来自google.appengine.api.runtime的方法开始返回true。第二
(和首选),您可以注册关机挂钩,如下所述
当应用程序引擎开始关闭实例时,现有请求将被删除
给30秒时间完成,新请求立即返回404。
如果实例正在处理请求,应用程序引擎将暂停该请求
并运行关机挂钩。如果没有激活的请求,则应用程序引擎
发送/_ah/stop请求,该请求运行关闭挂钩。这个
/_ah/停止请求绕过正常处理逻辑,无法处理
按用户代码;它的唯一目的是调用shutdownhook。如果你
在处理另一个异常时,在关闭挂钩中引发异常
请求,它将冒泡到请求中,在那里您可以捕获它
如果通过指定threadsafe启用了并发请求:true
在app.yaml(默认值)中,从
shutdownhook将该异常复制到所有线程。下面的代码
示例演示了一个基本的关闭挂钩:
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import runtime
def my_shutdown_hook():
apiproxy_stub_map.apiproxy.CancelApiCalls()
save_state()
# May want to raise an exception
runtime.set_shutdown_hook(my_shutdown_hook)
或者,下面的示例演示如何使用
\u正在关闭\u()方法:
注意:重要的是要认识到关闭挂钩并不总是有效的
能够在实例终止之前运行。在极少数情况下,停机
可能会发生阻止App Engine提供30秒的
关机时间。因此,我们建议定期检查状态
并将其主要用作内存缓存,而不是
而不是可靠的数据存储
基于以上假设,我希望这些方法也适用于您的情况,请尝试一下。看起来您正在替换应用程序的现有版本(默认版本)。当您这样做时,它不会优雅地处理现有的处理 每当我更新应用程序的生产版本时,我都会在新版本中进行更新。我使用当前日期作为我的版本名称(例如,2016-05-13)。然后我转到谷歌云控制台,将新版本设为默认版本。这样,旧版本继续并行运行
几年前我问了一个类似的问题,你可以看到。看起来你正在替换应用程序的现有版本(默认版本)。当您这样做时,它不会优雅地处理现有的处理 每当我更新应用程序的生产版本时,我