公司做的一个自动化运维项目,有一个需求是定时任务执行。前面的同事采用的是APScheduler的backgroundscheduler。由于是采用多线程来执行,为了防止多个对象来操作定时任务,造成定时任务多次执行的问题,采用单例模式来处理这个问题。代码比较简单,如下:
from functools import wraps
def singleton(cls,*args,**kwargs):
isinstance={}
@wraps(cls)
def _singleton():
if cls not in isinstance:
isinstance[cls]=cls(*args,**kwargs)
return isinstance[cls]
return _singleton
但是在本地直接runserver 测试的时候,会发现定时任务每次执行了两次,后面发现,runserver 默认情况会起一个进程来监控代码的变更,而多进程下,单例模式是无法起作用的,所以需要在runserver 后面加上:
python3 manage.py runserver --noreload # 这样就不会启动autoreload这个进程
本地测试没有问题,开始部署项目,采用的也是比较通用的Nginx + uwsgi + Django 这一套
部署完成之后发现,定时任务没有启动,排查原因,由于我们之前是通过manage.py来启动项目,而当用uwsgi来启动时,