按照书上介绍,使用apscheduler做定时任务,本地调试的时候,由于是单线程,所以到点,指定的任务会正常运行。但是部署上Nginx之后,由于gunicorn是四个线程,会发现定时任务会执行<=4 但是 >1次
有没有什么办法,可以让任务只能执行一次么?
网上找了些方法,没有尝试成功。
不知道有没有人遇到过这个问题?如何解决的?
按照书上介绍,使用apscheduler做定时任务,本地调试的时候,由于是单线程,所以到点,指定的任务会正常运行。但是部署上Nginx之后,由于gunicorn是四个线程,会发现定时任务会执行<=4 但是 >1次
有没有什么办法,可以让任务只能执行一次么?
网上找了些方法,没有尝试成功。
不知道有没有人遇到过这个问题?如何解决的?
已经用网上说得Linux的文件锁库解决了一下,不过还是想请各位大佬看看,是否有更好的办法:
由于是linux下的标准库,所以判断了一下是什么系统:
win = sys.platform.startswith(‘win’)
if not win:
import fcntl
f = open(‘task_lock.txt’, ‘w’)
if win or (not win and f.writable()):
if not win:
fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 文件加锁
处理过程…
处理完毕,解锁
if not win:
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
apscheduler的这个问题目前应该没有较好的解决方案。
如果你的项目部署在linux系统,推荐使用flask cli + cron job实现定时任务。
老生常谈的问题了
不要在部署(指用gunicorn这种多worker的服务器)的时候使用BackgroundScheduler随app一起启动,这种模式你development的时候用用就可以了
部署的时候应该要把apscheduler作为独立的进程启动(使用BlockingScheduler),也就是说你除了启动一个gunicorn的服务,还要启动一个apscheduler的进程,通常把他写成command用Flask命令行启动。
同理可推到所有需要常驻后台运行的服务