Как я могу запускать длинные задачи в Google App Engine, в котором используется пулемет?

GAE flex по умолчанию использует gunicorn в качестве точки входа, и это нормально, за исключением того, что у меня есть функция, которая занимает очень много времени для обработки (очистка веб-сайтов и данных истории в базе данных), и время ожидания Gunicorn по умолчанию составляет 30 секунд, затем новый рабочий начинает все заново, и так далее, и тому подобное.

Я могу установить таймаут пулеметчика примерно на 20 минут, но это не выглядит изящным. Есть ли способ запустить эти внутренние функции "вне" пулеметчика или, возможно, конфигурации пулеметчика, о которой я не думаю? Клиентской части нет, поэтому долгое время для завершения не является проблемой.

Мой файл app.yaml сейчас выглядит так:

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
  python_version: 2

# This sample incurs costs to run on the App Engine flexible environment. 
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/python/configuring-your app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 3
  disk_size_gb: 10

person Joe C.    schedule 09.01.2018    source источник


Ответы (1)


Вы можете использовать асинхронный рабочий класс, и тогда вам не нужно будет устанавливать тайм-аут на 20 минут. Рабочий класс по умолчанию - sync. Документы о сотрудниках здесь.

Используйте асинхронный воркер eventlet (gevent не рекомендуется при использовании клиентских библиотек Google)

pip install eventlet

Затем в вашем экземпляре gunicorn установите worker-class = 'eventlet' и установите количество рабочих равным [количество ядер] x 2 +1 (это просто рекомендация в google docs). Например:

CMD exec gunicorn --worker-class eventlet --workers 3 -b :$PORT main:app

Конфигурация рабочего стола Gunicorn

В качестве альтернативы используйте реализацию, описанную здесь используя pubsub и worker.

person Rob Curtis    schedule 16.07.2018
comment
Это работает, но учтите, что в среде Flex рабочие процессы (запросы и crons) ограничены 10 минутами. Это жесткий предел. (См. cloud.google.com/appengine/docs/ стандартный / java /) - person Cyril N.; 24.07.2020