作为 API 调用的一部分,我在 Google App Engine Flexible 上运行了一个函数。结构是这样的
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和以下讨论后: 如何增加 Google App Engine 请求计时器。默认为 60 秒
和 https://groups.google.com/forum/#!topic/google-appengine/3TtfJG0I9nA
我意识到这是因为如果任何代码运行超过 60 秒,App 引擎就会停止。我首先尝试根据Should Exception catch DeadlineExceededError 异常进行以下操作?
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
也可能有类似的答案,但我不知道任务队列是什么,而且我不能排队任何东西,因为我正在运行的关键功能是独立的,我不想只在某些情况下分解它。对我来说,增加 60 秒的限制会更容易。我怎样才能做到这一点?