flask中热更新数据模型
背景:
项目中使用flask结合机器学习,想定时更新模型,python中没有类似java静态变量一样。后来使用单独定义一个模块以全局变量来实现。
具体思路和代码
大体需求是训练集存放在数据库,每天增长,希望每天定时去训练数据集,flask接口去提供服务时模型数据总是以最新的模型提前加载缓存,以提高服务响应时间。
百度提供的思路大体不是很明白,要不就是不适用,看了一个回答是单独使用一个模块去提供全局变量,感觉可行,所以试了试。
思路:
单独写一个模块,写一个初始方法给默认集,并提供get,set方法。
flask启动定时任务去更新模型后重新set即可。
具体实现:
全局变量模块
gl_modle.py:
import pickle,os,sys
from LAC import LAC
global gl__lac
path = os.path.abspath(os.curdir)
global _gl_init
def _readbunchobj(path):
with open(path, "rb") as file_obj:
bunch = pickle.load(file_obj)
return bunch
def _init():#初始化
global _gl_init
_gl_init = {}
_gl_init["init"] = #模型一的默认集
_gl_init["lac"] = #模型二的默认集
def set_value(key,value):
_gl_init[key] = value
def get_value(key,defValue=None):
try:
return _gl_init[key]
except KeyError:
return defValue
在其他模块调用时:
import gl_modle as gl
#初始化
gl._init()
#想获取值
gl.get_value("lac")
#想变更值
gl.set_value("init",xxxx)
#在flask中的使用
app.py
from flask import *
import gl_modle as gl
app = Flask(__name__)
gl._init()
@app.route('/test/',methods=["POST"])
def test():
return “hellow”
#定时任务
class SchedulerConfig(object):
JOBS = [
{
'id': 'traindata', # 任务id
'func': 'train:trainData', # 任务执行程序
'args': (gl,), # 执行程序参数
'trigger': 'interval', # 任务执行类型,定时器
'seconds': 30, # 任务执行时间,单位秒
}
]
app.config.from_object(SchedulerConfig())
if __name__ == '__main__':
global train_tfidf_path
scheduler = APScheduler() # 实例化APScheduler
scheduler.init_app(app) # 把任务列表载入实例flask
scheduler.start() # 启动任务计划
app.run(host="0.0.0.0")
#定时训练的模块
train.py
def trainData(gl):
#此处为训练的具体逻辑和获取训练集
gl.set_value("init",xxx)
思路仅供参考,有更好的方法希望大佬们能够提点一下。