当我启用uwsgi线程支持并启动调度程序时,api停止工作

问题描述 投票:0回答:1

我是python,flask,nginx和所有其他东西的新手。

我有一个烧瓶应用程序,充当前端的API。另外,当烧瓶应用程序启动时,我想使用APScheduler启动计划的任务。

问题是,当我启用uwsgi线程支持并启动调度程序时,api停止工作(504网关超时)。但是调度程序的工作原理如日志文件中所示。当我删除调度程序/线程支持时,api可以正常工作,但我显然没有调度程序了。我以某种方式怀疑调度程序阻止了flask应用程序正常运行?

由于我不熟悉这些技术,因此我将在下面发布设置。如果您需要更多文件信息,请告诉我。(整个过程都在树莓派上运行,并且可以通过局域网从我的PC访问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 [minute =''],下一次运行:2019年12月18日19:01:00 CET)”已跳过:正在运行的实例数上限已达到(1)调试:apscheduler.scheduler:下次唤醒应于2019-12-18 19:02:00 + 01:00(在59.980780秒内)DEBUG:apscheduler.scheduler:寻找要运行的作业警告:apscheduler.scheduler:作业“ startHandlerJob执行(触发:cron [minute =''],下一次运行于:2019-12-18 19:02:00 CET)”已跳过:已达到运行实例的最大数量( 1)DEBUG:apscheduler.scheduler:下次唤醒应于2019-12-18 19:03:00 + 01:00(在59.979407秒内)

systemctl status app

* 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网关超时响应。当我删除调度程序并禁用线程支持时,此调用将按需要进行。

感谢您的帮助。可能我缺少明显的东西,因为我不熟悉这些东西。谢谢!

python nginx flask systemd apscheduler
1个回答
0
投票

我有点犹豫要回答这个问题,但是这里...

[在uwsgi app.ini中设置程序后(在您的情况下为5,我使用4),我也进行了设置threads = 2。我不知道这是否与--enable-threads选项有任何直接关系,因为这似乎是让您的应用程序启动它自己的线程,但这可能有助于uwsgi在每个进程中拥有自己的线程。另外,UWSGI文档指出(某处)更多的过程不一定更好。

此外,您的日志文件会显示调度程序发出的警告,提示已达到运行实例的最大数量。我认为这意味着您赋予调度程序的作业在下一次调度运行(1分钟后)之前尚未完成?如果是这种情况,它是否卡在某处,阻止了其他所有内容?

最后,如果所有其他操作均失败,则来自文档(UWSGI Security and availability)的其他信息

Webapp部署的常见问题是“卡住的请求”。您的所有线程/工作人员均被卡住(应要求阻止),您的应用无法接受更多请求。为避免该问题,您可以设置一个harakiri计时器。它是一个监视器(由主进程管理),它将破坏停留超过指定秒数的进程(请仔细选择harakiri值)。

最后,最后:)有一个类似uwsgi的监视工具之类的工具,可能很容易看到正在发生的事情,只是

pip install uwsgitop
uwsgitop 127.0.0.1:9191

加上远程登录该地址:端口显然向您显示了更多信息(我自己没有尝试过。)。>

© www.soinside.com 2019 - 2024. All rights reserved.