赞
踩
django项目中使用了apscheduler的定时任务框架,开发阶段通过python manage.py runserver 0.0.0.0:8000启动项目时,apscheduler可以自动启动。但部署生产环境通过uwsgi启动项目,apscheduler定时任务没有随项目的启动而自动启动,当通过浏览器打开登录网页,定时任务才启动。
在__init__.py文件中编写任务初始化
# 初始化函数 def init_task(): print('------------init_task---------------') try: # 加载任务 load_task() except Exception as e: print('初始化任务失败: {}'.format(e)) # 单实例类:初始化 class SingleInitTask(object): _instance = None lock = Lock() def __new__(cls, *args, **kwargs): if not getattr(cls, '_instance', None): with cls.lock: # 使用线程锁 if not getattr(cls, '_instance', None): cls._instance = super().__new__(cls) init_task() return cls._instance
通过baidu搜索,绝大多数人都是建议使用uwsgi的enable-threads参数,而 ini文件中已配置,如下:
command=uwsgi --socket 127.0.0.1:8000 --wsgi web.wsgi --enable-threads --home=/var/www/xxxinfo-manage/venv
最终找到合理的解释是:python manage.py 启动项目是通过manage.py驱动,而uwsgi启动通过wsgi.py驱动。故此需要将计划任务的视图文件放置在wsgi.py文件中,如下:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web.settings')
application = get_wsgi_application()
from tasks import views as taskview
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。