Когда я включаю поддержку потоков uWSGI и запускаю планировщик, API перестает работатьPython

Программы на Python
Ответить
Anonymous
 Когда я включаю поддержку потоков uWSGI и запускаю планировщик, API перестает работать

Сообщение Anonymous »

У меня есть приложение Flask, которое действует как API для внешнего приложения. Кроме того, при запуске приложения Flask я хотел бы запустить запланированное задание с помощью APScheduler.
Проблема в том, что когда я включаю поддержку потоков uWSGI и запускаю планировщик, API перестает работать («504 Gateway Time-out»). Но планировщик работает, как видно из файла журнала. Когда я удаляю поддержку планировщика/потоков, API работает, но у меня, очевидно, планировщика больше нет.
Почему-то я подозреваю, что планировщик препятствует правильному запуску приложения Flask.
Моя настройка приведена ниже (все это запускается на Raspberry Pi, и доступ к API осуществляется с моего ПК через локальную сеть).
app.service

Код: Выделить всё

[Unit]
Description=uWSGI instance to serve app
After=network.target

[Service]
User=pi
Group=www-data
WorkingDirectory=/home/pi/flask
Environment="PATH=/home/pi/flask/appenv/bin"
ExecStart=/home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads

[Install]
WantedBy=multi-user.target
app.ini

Код: Выделить всё

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = /home/pi/flask/app.sock
chmod-socket = 660
vacuum = true

die-on-term = true
app.py

Код: Выделить всё

#!/usr/bin/env python3

from flask import Flask, request
from apscheduler.schedulers.background import BackgroundScheduler

import logging
logging.basicConfig(filename='logfile.log',level=logging.DEBUG)

from api.Controller import Controller
from Handler.Handler import Handler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor

api_controller = Controller()
handler = Handler()

def startHandlerJob():
handler.ExecuteAllSensors()

app = Flask( __name__ )

@app.route('/app')
def apiDefinition():
return 'API Definition: GetHumidityValues, TODO'

@app.route( "/app/GetHumidityValues", methods=["GET"] )
def GetHumidityValues():
logging.info("app.py: API-call GetHumidityValues")
return api_controller.GetHumidityValues()

if (__name__ == "__main__"):
app.run(host='0.0.0.0')

executors = {
'default': ThreadPoolExecutor(20),
'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
'coalesce': False,
'max_instances': 1
}

scheduler = BackgroundScheduler(daemon=True, executors=executors, job_defaults=job_defaults)
scheduler.start()
scheduler.add_job(startHandlerJob,'cron', minute='*')
logfile.log
ПРЕДУПРЕЖДЕНИЕ:apscheduler.scheduler:Выполнение задания «startHandlerJob (триггер: cron[минута=''], следующий запуск в: 18 декабря 2019 г., 19:01:00 CET)» пропущено: достигнуто максимальное количество запущенных экземпляров (1)
DEBUG:apscheduler.scheduler:Следующее пробуждение запланировано на 18 декабря 2019 г., 19:02:00+01:00 (через 59,980780 секунд)
DEBUG:apscheduler.scheduler:Ищем задания для запуска
ПРЕДУПРЕЖДЕНИЕ:apscheduler.scheduler:Выполнение задания «startHandlerJob (триггер: cron[минута=''], следующий запуск в: 2019-12-18 19:02:00 CET)» пропущен: достигнуто максимальное количество запущенных экземпляров (1)
DEBUG:apscheduler.scheduler:Следующее пробуждение запланировано на 18 декабря 2019 г. 19:03:00+01:00 (за 59,979407 секунд)
приложение статуса systemctl

Код: Выделить всё

* app.service - uWSGI instance to serve app
Loaded: loaded (/etc/systemd/system/app.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2019-12-18 18:40:57 CET; 23min ago
Main PID: 21129 (uwsgi)
Tasks: 8 (limit: 2200)
Memory: 22.9M
CGroup: /system.slice/app.service
|-21129 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads
|-21148 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads
|-21149 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads
|-21150 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads
|-21151 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads
`-21152 /home/pi/flask/appenv/bin/uwsgi --ini app.ini --enable-threads

Dec 18 18:40:57 raspberrypi uwsgi[21129]: mapped 386400 bytes (377 KB) for 5 cores
Dec 18 18:40:57 raspberrypi uwsgi[21129]: *** Operational MODE: preforking ***
Dec 18 18:40:59 raspberrypi uwsgi[21129]: WSGI app 0 (mountpoint='') ready in 2 seconds on interpreter 0xa6f900 pid: 21129 (default app)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: *** uWSGI is running in multiple interpreter mode ***
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI master process (pid: 21129)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI worker 1 (pid: 21148, cores: 1)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI worker 2 (pid: 21149, cores: 1)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI worker 3 (pid: 21150, cores: 1)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI worker 4 (pid: 21151, cores: 1)
Dec 18 18:40:59 raspberrypi uwsgi[21129]: spawned uWSGI worker 5 (pid: 21152, cores: 1)
Файл журнала показывает, что планировщик активен. Но когда я пытаюсь использовать http:/raspberryipaddress/app, ответом является ответ «504 Gateway Time-out». Когда я удаляю планировщик и отключаю поддержку потоков, этот вызов работает как надо.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»