问题
使用flask配合结巴库做了一个分词接口,做定时任务每天从数据库拉取自定义词汇作为其自定义词典,使用uwsgi部署.
问题点是在uwsgi运行时,即使从数据库拉取了数据,词典也不会加载到内存中,也就是新的词汇不生效
解决办法
办法一
在flask再添加一个定时任务,当词典拉取后就调用词典加载程序,将词典加载到内存中 --不可行
原因:因为在uwsgi运行时,之前的词典已经加载到内存中,在次加载词典不生效
方法二
uwsgi中有一个配置py-autoreload=1
,当有py文件改变时会自动重启uwsgi服务,正好符合我们的要求,
当词典定时更新后在一个py文件中写入一个字符串,每次写入不一样,uwsgi就会监测到py文件有改变,进而重启uwsgi服务,重新加载更新后的词典.
我是每次写入当前时间戳.
缺点:需要uwsgi重启,在线上要考虑重启时间,也就是词典定时拉取时间,我将其定时在凌晨3.
以下是 uwsgi.ini配置
[uwsgi]
master = true
process = %(%k*2)
threads = %(%k*20)
chdir = %v
http = 0.0.0.0:5000
disable-logging = true
wsgi-file = %v/tokenizer_main.py
callable = app
enable-threads = true
mule = %v/myscheduler.py
buffer-size = 65536
py-autoreload = 1
下面是scheduler代码
from apscheduler.schedulers.background import BackgroundScheduler
from dictionary_management import update_user_dict
scheduler = BackgroundScheduler(timezone="Asia/Shanghai")
# 定时更新用户词典
# scheduler.add_job(update_user_dict, 'interval', minutes=10)
scheduler.add_job(update_user_dict, 'cron', hour=3,minute=10)
scheduler.start()
try:
import uwsgi
while True:
sig = uwsgi.signal_wait()
(sig)
except Exception as err:
pass