增加 运行 代码的时间 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’。

这里居然提供了答案https://serverfault.com/questions/490101/how-to-resolve-the-gunicorn-critical-worker-timeout-error/627746

基本上,使用文档 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 秒,但可以根据一些试验和错误对其进行优化。然而,这解决了我的特殊问题,即 运行 宁一个代码比平常需要更长的时间