gunicorn部署flask项目apscheduler重复执行定时任务解决方案

1.gunicorn启动配置中增加–preload
2.全局锁确保实例化apscheduler只运行一次,文件锁/端口锁/redis/mysql等数据库锁均可,可能导致无法使用modify_job编辑任务
3.add_job(func=add_job_xxx,...)时,在add_job_xxx中实现加锁逻辑保证任务只运行一次,文件锁/端口锁/redis/mysql等数据库锁均可,可以正常使用modify_job编辑任务
4.实例化apscheduler时,增加父进程ID判断,if os.getppid() == 1来判断,可能导致无法使用modify_job编辑任务。(sysytemd管理服务时init进程ID为1)
5.思路就是区分Mster进程与Worker进程来加锁,可以通过if os.environ.get('WERKZEUG_RUN_MAIN') == 'true'来判断

总结,以上各种方式各有优劣,加锁需要维护锁状态,避免死锁。可以根据具体环境来进行选用。

posted @ 2020-11-19 15:49  JeromePowell  阅读(2122)  评论(0编辑  收藏  举报