增加 运行 代码的时间 Google 灵活的应用引擎延迟 DeadlineExceededError
Increase time to run code for Google flexible app engine delaying DeadlineExceededError
我在 Google App Engine Flexible 上有一个函数 运行ning 作为 API 调用的一部分。结构是这样的
import externalmod
...
...
@app.route('/calc_here')
def calc:
answer = externalmod.Method()
return answer
函数 externalmod 是一个复杂的算法(不是数据存储,不是 urlfetch,只是纯粹的 python),它适用于桌面上的所有可能情况,但适用于应用引擎上的某些输入情况,当端点被称为它给出以下错误
{
"code": 13,
"message": "BAD_GATEWAY",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"stackEntries": [],
"detail": "application"
}
]
}
查看 https://cloud.google.com/appengine/articles/deadlineexceedederrors 和以下讨论后:
How to increase Google App Engine request timer. Default is 60 sec
和
https://groups.google.com/forum/#!topic/google-appengine/3TtfJG0I9nA
我意识到这是因为如果任何代码 运行 超过 60 秒,App 引擎将停止。
我首先尝试根据 Should Exception catch DeadlineExceededError exceptions?
执行以下操作
from google.appengine.runtime import DeadlineExceededError
try:
answer = externalmod.Method()
except DeadlineExceededError:
answer = some_default
但是我得到了没有模块的错误google.appengine
然后意识到所有文档都是针对标准环境的,但我使用的是灵活的环境我认为这个 appengine.runtime 可能甚至不再存在
当我这样做时:
try:
answer = externalmod.Method()
except :
answer = some_default
它起作用了,我开始捕捉到一些 DeadlineExceededErrors。但显然,我不能总是像这样捕获 DeadlineExceededErrors。因为有时我会发现错误,有时不会。我认为最好的方法是增加允许代码 运行 的时间量,而不是仅仅捕获异常。
我试图通过添加 CPU:2 来更改 app.yaml 文件,但没有任何区别。
runtime_config:
python_version: 3
resources:
cpu: 2
memory_gb: 4
manual_scaling:
instances: 1
也许这个问题Taskqueue for long running tasks in FLEXIBLE app engine
也可能有类似的答案,但我不知道任务队列是什么,而且我无法对任何东西进行排队,因为我 运行ning 的关键功能是独立的,我不想分解它仅针对某些情况。只是增加 60 秒的限制对我来说会更容易。我该怎么做?
因为我没有得到任何答案,所以我继续搜索。我意识到许多其他人也有类似的问题。
首先要注意的是,GAE 柔性环境不像标准环境那样具有大多数标准约束。这意味着 DeadlineExceededError
不存在,因为没有 60 秒的截止日期。所有模块和代码 运行 就像它们在任何计算机上一样,因为它们都包含在 Docker 容器中。
https://cloud.google.com/appengine/docs/flexible/python/migrating
另外,没有google.appengine模块。根据所使用的语言,所有云交互都应通过 google.cloud API https://cloud.google.com/apis/docs/overview
进行
那么什么可以解释这个超时呢?我检查了 google 云项目控制台中的日志记录。我看到相关的错误实际上是 [CRITICAL] WORKER TIMEOUT
,它发生在函数被调用后整整 30 秒。这与 GAE flex 无关,而与服务器框架有关。在我的例子中是‘gunicorn’。
基本上,使用文档 http://docs.gunicorn.org/en/latest/settings.html#config-file
唯一需要更改的是 app.yaml 文件
之前是
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
gunicorn worker 有默认的 30 秒超时
将此更改为
entrypoint: gunicorn -t 120 -b :$PORT main:app
此处的超时时间为 120 秒,但可以根据一些试验和错误对其进行优化。然而,这解决了我的特殊问题,即 运行 宁一个代码比平常需要更长的时间
我在 Google App Engine Flexible 上有一个函数 运行ning 作为 API 调用的一部分。结构是这样的
import externalmod
...
...
@app.route('/calc_here')
def calc:
answer = externalmod.Method()
return answer
函数 externalmod 是一个复杂的算法(不是数据存储,不是 urlfetch,只是纯粹的 python),它适用于桌面上的所有可能情况,但适用于应用引擎上的某些输入情况,当端点被称为它给出以下错误
{
"code": 13,
"message": "BAD_GATEWAY",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"stackEntries": [],
"detail": "application"
}
]
}
查看 https://cloud.google.com/appengine/articles/deadlineexceedederrors 和以下讨论后: How to increase Google App Engine request timer. Default is 60 sec
和 https://groups.google.com/forum/#!topic/google-appengine/3TtfJG0I9nA
我意识到这是因为如果任何代码 运行 超过 60 秒,App 引擎将停止。 我首先尝试根据 Should Exception catch DeadlineExceededError exceptions?
执行以下操作from google.appengine.runtime import DeadlineExceededError
try:
answer = externalmod.Method()
except DeadlineExceededError:
answer = some_default
但是我得到了没有模块的错误google.appengine
然后意识到所有文档都是针对标准环境的,但我使用的是灵活的环境我认为这个 appengine.runtime 可能甚至不再存在 当我这样做时:
try:
answer = externalmod.Method()
except :
answer = some_default
它起作用了,我开始捕捉到一些 DeadlineExceededErrors。但显然,我不能总是像这样捕获 DeadlineExceededErrors。因为有时我会发现错误,有时不会。我认为最好的方法是增加允许代码 运行 的时间量,而不是仅仅捕获异常。
我试图通过添加 CPU:2 来更改 app.yaml 文件,但没有任何区别。
runtime_config:
python_version: 3
resources:
cpu: 2
memory_gb: 4
manual_scaling:
instances: 1
也许这个问题Taskqueue for long running tasks in FLEXIBLE app engine
也可能有类似的答案,但我不知道任务队列是什么,而且我无法对任何东西进行排队,因为我 运行ning 的关键功能是独立的,我不想分解它仅针对某些情况。只是增加 60 秒的限制对我来说会更容易。我该怎么做?
因为我没有得到任何答案,所以我继续搜索。我意识到许多其他人也有类似的问题。
首先要注意的是,GAE 柔性环境不像标准环境那样具有大多数标准约束。这意味着 DeadlineExceededError
不存在,因为没有 60 秒的截止日期。所有模块和代码 运行 就像它们在任何计算机上一样,因为它们都包含在 Docker 容器中。
https://cloud.google.com/appengine/docs/flexible/python/migrating
另外,没有google.appengine模块。根据所使用的语言,所有云交互都应通过 google.cloud API https://cloud.google.com/apis/docs/overview
进行那么什么可以解释这个超时呢?我检查了 google 云项目控制台中的日志记录。我看到相关的错误实际上是 [CRITICAL] WORKER TIMEOUT
,它发生在函数被调用后整整 30 秒。这与 GAE flex 无关,而与服务器框架有关。在我的例子中是‘gunicorn’。
基本上,使用文档 http://docs.gunicorn.org/en/latest/settings.html#config-file
唯一需要更改的是 app.yaml 文件
之前是
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
gunicorn worker 有默认的 30 秒超时
将此更改为
entrypoint: gunicorn -t 120 -b :$PORT main:app
此处的超时时间为 120 秒,但可以根据一些试验和错误对其进行优化。然而,这解决了我的特殊问题,即 运行 宁一个代码比平常需要更长的时间