#安装
pip install djcelery
#同步数据库
python manage.py makemigrations
python manage.py migrate
#settings.py
INSTALLED_APPS = (
#……
'djcelery',#添加刚安装的djcelery
)
……
import djcelery
from celery import platforms
from celery.schedules import crontab
from settings import djcerery_setting
djcelery.setup_loader()
#broker是代理人,它负责分发任务给worker去执行
BROKER_URL = 'redis://172.16.68.151:6379/6'
#导入目标任务文件
CELERY_IMPORTS = ('punch.tasks',)
#设置时区
CELERY_TIMEZONE = TIME_ZONE
## 定时任务调度器,表示使用了django-celery默认的数据库调度模型,任务执行周期都被存在默认指定的orm数据库中.
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
platforms.C_FORCE_ROOT = True
#定时任务
CELERYBEAT_SCHEDULE = {
'celery_test': {
"task": "appname.tasks.celery_test",
"schedule": crontab(minute='*', hour=12),
"args": (),
},
}
app下创建task.py
# coding=utf-8
from celery import task
from redis import StrictRedis
redis = StrictRedis(host='172.xx.xx.xxx', port=6379, db=0)
@task()
def celery_test():
print('------- celery_test--------')
#Django下要查看其他celery的命令,包括参数配置、启动多worker进程的方式都可以通过help来查看
python manage.py celery --help
# 启动web服务
python manage.py runserver 172.xx.xx.xx:8000
# celery worker:(工人)启动worker节点来处理任务
python manage.py celery worker -l info
# celery beat:(领导)启动周期任务
python manage.py celery beat -l info
#Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现
#启动可视化flower
python manage.py celery flower --address=172.xx.xx.xx --port=5555#
#方便测试,同时启动worker,beat
python manage.py celery worker -B -l info
# 守护进程
# celery multi start w1 -A celery_tasks.main -l info --logfile=./celerylog.log
# python manage.py celery multi start w1 -l info --logfile=./celerylog.log
# 停止和重启 分别将 start 改为 stop / restart
setting文件中配置CELERYBEAT_SCHEDULE
task:需要执行的任务名称
schedule:任务执行时间设定,可以是整秒数,一个timedelta对象,或者一个crontab对象,也可以自己实现。
args:一个元组或者列表,位置参数
kwargs:一个字典,关键字参数
options:一个字典,一些额外选项,apply_async()方法可用的参数,exchange, routing_key, expires等
relative:默认false
定时任务的时间 Crontab
class celery.schedules.crontab(minute=u'*', hour=u'*', day_of_week=u'*', day_of_month=u'*', month_of_year=u'*', **kwargs)
一个表示时间间隔的对象,语法与linux的crontab类似。
minute和hour可以设置为*/15,/2,分别表示每隔15分钟和每隔2小时。
day_of_week用可以0-6的数字表示,也可以文字表示mon-fri。/2并不是每2天,而是每半天。
其中,crontab()实例化的时候没设置任何参数,都是使用默认值。crontab一共有7个参数,常用有5个参数分别为:
minute:分钟,范围0-59;
hour:小时,范围0-23;
day_of_week:星期几,可以0-6的数字表示,也可以文字表示mon-fri。以星期天为开始,即0为星期天。这个星期几还可以使用英文缩写表示,例如“sun”表示星期天,*/2并不是每2天,而是每半天。;
day_of_month:每月第几号,范围1-31;
month_of_year:月份,范围1-12。
官网一些具体例子:
crontab() 每分钟
crontab(minute=0, hour=0) 每天的0时0分
crontab(minute=0, hour=’/3’) 每三小时
crontab(day_of_week=‘sunday’) 周日的每一小时
crontab(minute=’’,hour=’’, day_of_week=‘sun’) 与上面相同
crontab(minute=0, hour=’/3,8-17’) 每三个小时 8时到17时的每小时
1.Django Celery定时任务和时间设置
(时间设置十分详细,datetime、crontab)
https://www.cnblogs.com/dengshihuang/p/8258621.html
2.Django中使用Celery实现定时任务(用djcelery)
https://www.cnblogs.com/crb912/p/8976937.html
3.Celery(四)定时任务
https://www.cnblogs.com/linxiyue/archive/2017/12/21/8082102.html
4.基于Django+celery二次开发动态配置定时任务 ( 一 )
(包含内存泄漏的解决)
https://www.cnblogs.com/huangxiaoxue/p/7266253.html
5.Django中使用Celery实现定时任务(用djcelery)
(对于celery参数说的很详细)
https://www.cnblogs.com/crb912/p/8976937.html