Python3.8 + Django3.0 + Celery
如果你正在找celery的使用方法,硬核内容拿走不谢。。。
1. 安装包
django-celery == 3.3.1
django-celery-beat == 2.3.0 (版本很重要,会影响启动worker/beat)
redis == 4.1.0
celery == 5.2.7
2. 代码结构
3. django_demo
需要增加以下三部分的修改内容:一、settings.py;二、celery.py;三、__init__.py
3.1 settings.py
需要在settings.py文件中,INSTALLED_APPS 中加入django_celery_beat包和定时任务所在的模块包,这里我的定时任务是放在celery_job文件下的
3.1.1 settings.py celery相关配置
BROKER_URL = 'redis://:{password}@{host}:{port}/{db}'.format(password=REDIS_PWD,
host=REDIS_HOST,
port=REDIS_PORT,
db=REDIS_DB,
)
CELERY_TIMEZONE = TIME_ZONE
CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' # 任务入库
CELERY_RESULT_BACKEND = BROKER_URL # 使用redis 的方式触发
CELERY_ENABLE_UTC = False
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERYD_LOG_FILE = BASE_DIR + "/logs/celery/celery.log" # log路径
CELERYBEAT_LOG_FILE = BASE_DIR + "/logs/celery/beat.log" # beat log路径
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] # 允许的格式
CELERY_TASK_SERIALIZER = 'json'
CELERYD_MAX_TASKS_PER_CHILD = 3
CELERY_IMPORTS = ("celery_job.tasks",) # 获取指定模块下的定时任务
3.2 celery.py
这里很关键,很关键,很关键,重要事情说三遍,在Ubuntu中,需要设置环境变量 export C_FORCE_ROOT=True
3.3 init.py
4. celery_job 下tasks.py 定时任务
5. 增加数据库基础表
在settings.py的配置文件中CELERYBEAT_SCHEDULER 设置了定时任务入库,我这里使用的是mysql数据库,所以需要需要几张常用数据表
django_celery_beat_clockedschedule 用来保存定时策略
django_celery_beat_crontabschedule 用来保存周期策略
django_celery_beat_intervalschedule 用来保存固定的时间间隔策略
django_celery_beat_periodictask 用来保存task
6. 使用django-admin 来配置添加定时任务
7. windows 启动方式
进入到manage.py 目录cmd
Celery -A django_demo worker -l info -P eventlet
celery -A django_demo beat -l info
8. Ubuntu 启动方式
进入到manage.py 目录
Celery -A django_demo worker -l info
celery -A django_demo beat -l info
9. 扩展
因为我的定时任务是入库的,所以通过数据库中django_celery_beat_periodictask 不然看出,定时任务的触发,需要三个条件,定时任务名称:name,任务:task,是否触发:enabled,还有间隔任务/定时任务:crontab_id/interval_id
所以动态定时的添加只依赖两张表的使用django_celery_beat_periodictask任务表和django_celery_beat_crontabschedule /django_celery_beat_intervalschedule,因此可以代码实现定时创建: