У меня есть одна функция, работающая в Google App Engine Flexible, как часть вызова 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 и следующих обсуждений: Как увеличить таймер запроса Google App Engine.По умолчанию установлено значение 60 с
и https://groups.google.com/forum/#!topic/google-appengine/3TtfJG0I9nA
. Я понял, что это происходит из-за того, что движок приложения остановится, если выполнение какого-либо кода длится более 60 секунд.Сначала я попытался сделать следующее в соответствии с Должно ли Exception перехватывать исключения 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 как это.Как иногда я ловлю ошибку, а иногда нет.Я подумал, что лучшим способом было бы увеличить количество времени, которое разрешено выполнять коду, а не просто перехватывать исключение.
Я пытался изменить файл app.yaml, добавив CPU: 2, но ничего не изменилось.
runtime_config:
python_version: 3
resources:
cpu: 2
memory_gb: 4
manual_scaling:
instances: 1
Может быть, этот вопрос Taskqueue для длительных задач в движке приложения FLEXIBLE
также может иметь аналогичный ответ, но я понятия не имею, что такое Taskqueue, а такжеЯ не могу ничего поставить в очередь, так как критическая функция, которую я выполняю, автономна, и я не хочу разбивать ее только на некоторые случаи.Мне было бы проще увеличить предел 60 с.Как я могу это сделать?