gunicorn部署flask项目定时器apscheduler添加任务不运行

gunicorn部署flask项目定时器apscheduler添加任务不运行

1.概述

在开发环境运行定时器apscheduler添加任务运行正常,使用gunicorn部署flask项目后添加定时任务后不运行。
下面介绍下不运行的原因和解决方法。

2.定时器任务不运行原因

2.1.分析原因

在开发环境直接调用flask运行定时器业务运行正常,生产环境使用gunicorn作为web服务运行环境运行flask服务,定时器不运行。那么问题就在gunicorn插件上,因此从该插件上开始分析。

1.了解gunicorn

工作原理
gunicorn采用了pre-fork worker的进程模型。简单说,就是通过一个master进程fork一系列子进程来响应请求,master进程负责创建和管理这些子进程,而子进程则专注于把网络数据交给Application来处理。所以,gunicorn永远只存在一个master进程,和N个worker进程(N>=1)。这里的N,就是gunicorn配置里的workers。

正常启动模式
在master进程创建之后,每个worker都会加载一个flask app进来。如果存在十个进程worker,那么就要重复加载十次flask对象。十个进程worker都有独立的进程地址。

预加载模式
设置preload_app=True后,开启预加载模式。flask 对象会在master进程中加载进来,随后的worker进程是fork出来的,就不需要再加载一次了。所以,preload_app的第一个作用是节省了那么一点点可以忽略不计的服务启动时间。
设置了预加载后,内存会在多个进程间共享,但是有一个前提条件只有只读的内存区域才能被“共享”,如果不断的在内存中写入数据,那么则不会共享。

2.定时器不运行原因

当设置了gunicorn为预加载模式启动后,master进程加载flask,flask对象创建APScheduler对象。gunicorn启动完成后fork出worker子进程。此时客户端发起添加定时任务请求,gunicorn使用worker进程调用APScheduler对象添加任务。APScheduler默认添加的任务存储在内存中,master进程创建APScheduler对象和worker进程添加了任务,他们是两个进程,进程之间内存数据互不共享,worker进程添加的任务在master中是不存在的,因此也就不会运行任务。

3.解决任务不运行

不使用预加载模式启动任务,master进程fork出worker子进程,worker进程加载flask并创建APScheduler对象,然后通过worker子进程添加任务,此时同进程的内存数据是共享,所以任务可以运行。

Gunicorn配置文件

preload_app = Falsk # 设置gunicorn不使用预加载模式启动
workers = 1  # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent"  # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8080"
# 设置超时时间120s,默认为30s。按自己的需求进行设置
timeout = 120
accesslog = '/home/web/logs/gunicorn_acess.log'
errorlog = '/home/web/logs/gunicorn_error.log'
# 设置日志记录水平
loglevel = 'warning'


猜你喜欢

转载自blog.csdn.net/m0_38039437/article/details/130389376
今日推荐