- 端口问题:服务器的安全组要加入对应端口才能访问,例如nginx默认访问80端口,就要假如80端口到安全组中。服务器中的防火墙如果开启了,也要打开需要的端口才能访问
- 修改代码后需要重启gunicorn来使代码生效,如果使用了supervisor就用supervisor来重启
- 使用apscheduler来创建定时任务的情况下,假如使用gunicorn启动了多进程(worker),那么每个进程都会初始化一个任务调度器,导致定时任务被重复执行。
解决方法:
- gunicorn启动配置中增加–preload(虽然这样可以使用scheduler创建代码只执行一次,但是问题也在于它只执行一次,重新部署以后如果用kill -HUP重启gunicorn,它并不会重启,甚至整个项目都不会更新。这是preload的副作用,除非重写部署脚本,完全重启应用。)
- 全局锁确保实例化apscheduler只运行一次,文件锁/端口锁/redis/mysql等数据库锁均可,可能导致无法使用modify_job编辑任务(本人使用方法)
- add_job(func=add_job_xxx,...)时,在add_job_xxx中实现加锁逻辑保证任务只运行一次,文件锁/端口锁/redis/mysql等数据库锁均可,可以正常使用modify_job编辑任务
- 实例化apscheduler时,增加父进程ID判断,if os.getppid() == 1来判断,可能导致无法使用modify_job编辑任务。(sysytemd管理服务时init进程ID为1)
- 思路就是区分Master进程与Worker进程来加锁,可以通过if