上述 INSTALLED_APPS中我省略了无关的模块,注意加入djcelery即可。
我在setting.py的文件结尾处,加入了如下的celery参数配置,先贴代码,再解释。
import djcelery djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379/6' CELERY_IMPORTS = ('app.tasks', ) CELERY_TIMEZONE = TIME_ZONE CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 下面是定时任务的设置,我一共配置了三个定时任务. from celery.schedules import crontab CELERYBEAT_SCHEDULE = { #定时任务一: 每24小时周期执行任务(del_redis_data) u'删除过期的redis数据': { "task": "app.tasks.del_redis_data", "schedule": crontab(hour='*/24'), "args": (), }, #定时任务二: 每天的凌晨12:30分,执行任务(back_up1) u'生成日报表': { 'task': 'app.tasks.back_up1', 'schedule': crontab(minute=30, hour=0), "args": () }, #定时任务三:每个月的1号的6:00启动,执行任务(back_up2) u'生成统计报表': { 'task': 'app.tasks.back_up2', 'schedule': crontab(hour=6, minute=0, day_of_month='1'), "args": () }, }上述代码释义:
当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。
1.
BROKER_URL = 'redis://127.0.0.1:6379/6'broker是代理人,它负责分发任务给worker去执行。我使用的是Redis作为broker,当然你也可以用其它的broker,比如官方就比较推荐使用RabbitMQ.
有的博客中提到要配置关键字:CELERY_RESULT_BACKEND,例如:
CELERY_RESULT_BACKEND = 'amqp://guest@localhost//' #可以不用写我没有配置这个关键字。因为如果没有配置,此时Django会使用默认的数据库(也是你指定的orm数据库),作为它的结果作为它的backend。因此你也可以不用写,使用Django默认设置的数据库就很好。 2.
CELERY_IMPORTS = ('app.tasks', ) CELERY_TIMEZONE = TIME_ZONE CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'上面第一句是导入目标任务文件,第二句是设置时区,第三句表示使用了django-celery默认的数据库调度模型,任务执行周期都被存在默认指定的orm数据库中.
更深入的Celery配置:(http://www.cnblogs.com/ajianbeyourself/p/4950758.html) 3.
from celery.schedules import crontab CELERYBEAT_SCHEDULE = { #定时任务一: 每24小时周期执行任务(del_redis_data) u'删除过期的redis数据': { "task": "app.tasks.del_redis_data", "schedule": crontab(hour='*/24'), "args": (), },上面是设置定时的时间配置,关于crontab的用法,官方的文档讲解的十分详尽(文档末尾的表格):
http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
每个任务本质上就是一个函数,在tasks.py中,写入你想要执行的函数即可。我的tasks.py如下:我写的每个任务又臭又长,因此具体的细节就省略了。
# coding=utf-8 from celery import task @task() def del_redis_data(): # 此处是一个删除redis数据的操作。具体略过 @task() def back_up1(): # 此处是一个备份到日报表的操作。具体略过 @task() def back_up2(): # 此处是一个生成统计报表的操作。具体略过如果读者需要自己实现一个定时任务,那么上述的task函数必然要自己去定义,我只提供了参考。我上面的三个任务,分别对应了setting.py文件的CELERYBEAT_SCHEDULE的三个定时配置。
要记住的是,任务只是一个函数,这个函数什么时候调用,取决你在setting.py中的配置。
到目前为止,只是对任务进行了配置,但是还没有实际运行任务,要支持周期任务,需要启动一个组件 beat,它用于对任务进行调度,我们以 crowdfunding项目名称 为例进行说明。
celery -A crowdfunding beat这个命令会启动 cele 应用的 beat,当然也可以在启动 worker 的时候使用 -B 参数同时启动 beat 。
celery -A crowdfunding worker -l info -B 或者 启动django和celery, 并查看日志celery -A crowdfunding worker -l debug# 另一个窗口
celery -A crowdfunding beat -l debug --max-interval=10 # 每10s扫描一次djcelery任务
