Flask-APScheduler 如何避免因为多个 Worker 导致任务重复执行

按照书上介绍,使用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命令行启动。

同理可推到所有需要常驻后台运行的服务

1 个赞