1. 介绍
django-crontab
是django连接linux中crontab定时任务
- 可以直接在django中编写crontab表达式,然后启动django时直接将任务部署到系统中
2. 需求来源
我是因为celery
启动时选择了协程gevent
启动,而celery
在选择这种方式启动时,自带的两个以运行时间/占用内存为指标然后重启的参数不支持,因此随着时间celery
的worker
占用内存会越来越多,浪费服务器资源。
因此只能自己想办法重启,且要能在系统层面重启。当然,直接在后台添加crontab任务是可以的,但是作为一个成熟Django应用程序的话,最好是能够自动完成这些部署,省去每次发布都要手动添加这些任务,而且也方便docker容器化部署。
3. 使用
3.1 配置setting.py
文件
#`INSTALLED_APPS`中添加`django_crontab`;
INSTALLED_APPS += ['django_crontab']
# 配置django-crontab jobs
CRONJOBS = [
#第一个参数是crontab时间格式
#第二个参数是被执行任务的路径
('00 2 * * *', 'schedule.tasks.restart_celery_worker')
]
3.2 书写任务
根据上面的路径,或者说写好函数再改上面的路径
# _*_ coding: utf-8 _*_
import os
def restart_celery_worker():
# Linux, Darwin
# 执行命令位置在项目的根目录
os.chdir('/app/TesterUnchained')
# 找到celery的环境变量位置,否则会报错
os.system('/usr/local/bin/celery multi restart 2 --pool=gevent -c:1-2 100 -A config.celery_app -l info')
3.3 书写启动脚本start.sh
执行命令:bash start.sh
也可以单独执行每个命令
#!/usr/bin/env bash
# delete celery pid file
rm celerybeat.pid celery2.pid celery1.pid
# start celery worker
celery multi start 2 -c:1-2 100 -A config.celery_app --pool=gevent -l info
# start celery beat
nohup python3 manage.py celery beat -l info > ./TesterUnchained/logs/beat.log 2>&1 &
# crontab add
python3 manage.py crontab add
env >> /etc/default/locale
/etc/init.d/cron restart
# start app
uwsgi --ini ./config/uwsgi.ini
3.4 修改uwsgi.ini`,以gevent方式启动app
一旦服务器安装了gevent,就不得不以gevent方式启动app了,否则会报错。
也不得不以gevent方式启动celery。
# 添加参数
gevent=1000
gevent-early-monkey-patch=true ;
3.5 服务器安装crontab
apt-get update && apt-get upgrade -y && apt-get install cron
4 完成
至此就可以完美解决celery,gevent模式内存高的问题。
celery启动的两个worker将会在每天凌晨两点重启,释放内存。