Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GAE更新应用程序,如何避免长过程的暴力停止?_Python_Google App Engine - Fatal编程技术网

Python GAE更新应用程序,如何避免长过程的暴力停止?

Python GAE更新应用程序,如何避免长过程的暴力停止?,python,google-app-engine,Python,Google App Engine,我有一个GAE应用程序,它通过另一个模块(通过基本的扩展管理)生成一些长过程 这个长进程正确地处理DeadlineExceededError,但产生了一个延迟方法,该方法将保存长进程的当前状态,以便稍后恢复 今天我发现,当我做一个appcfg.py-a update myapp/时,它突然停止了漫长的过程。停下来吧,没有死亡线(我的希望来了),什么都没有 在停止应用程序之前,GAE是否会触发一些事件,让我保存长进程的当前状态,将数据写入文件(通过s3,所以有点长),并重新排队等待稍后重新运行?(

我有一个GAE应用程序,它通过另一个模块(通过基本的扩展管理)生成一些长过程

这个长进程正确地处理DeadlineExceededError,但产生了一个延迟方法,该方法将保存长进程的当前状态,以便稍后恢复

今天我发现,当我做一个
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)。然后我转到谷歌云控制台,将新版本设为默认版本。这样,旧版本继续并行运行


几年前我问了一个类似的问题,你可以看到。

看起来你正在替换应用程序的现有版本(默认版本)。当您这样做时,它不会优雅地处理现有的处理

每当我更新应用程序的生产版本时,我