djcelery(django、celery)实现定时任务

  • 安装djcelery
#安装
pip install djcelery
#同步数据库
python manage.py makemigrations 
python manage.py migrate
  • 在setting中配置djcelery
#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--------')
  • 启动worker,beat,flower等常用命令
#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

你可能感兴趣的:(django)