使用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