django-celery的配置及使用
定时任务:定期去统计日志,数据备份,或者其他的统计任务
相关概念
task:需要执行的任务
worker:负责干活的小弟们
broker:结果存放的位置
celery的安装和使用
pip install celery pip install celery-with-redis pip install django-celery apt install redis-server
配置
ALLOWED_HOSTS = ['*'] INSTALLED_APPS = ( ... 'djcelery', ‘自己的APP’ } import djcelery djcelery.setup_loader() BROKER_URL='redis://localhost:6379/1' CELERY_CONCURRENCY=2(设置worker的并发数量) CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'
from __future__ import absolute_import #绝对路径导入 from celery import Celery from django.conf import settings import os #设置系统的环境配置用的是Django的 os.environ.setdefault("DJANGO_SETTING_MODULE", "工程名字.settings") #实例化celery app = Celery('mycelery') app.conf.timezone = "Asia/Shanghai" #指定celery的配置来源 用的是项目的配置文件settings.py app.config_from_object("django.conf:settings") #让celery 自动去发现我们的任务(task) app.autodiscover_tasks(lambda : settings.INSTALLED_APPS) #你需要在app目录下 新建一个叫tasks.py(一定不要写错)文件
from __future__ import absolute_import, unicode_literals from .celery import app as celery_app
from celery import task import time @task def hello_celery(loop): for i in range(loop): print 'hello' time.sleep(2)
任务函数名.delay(参数,,,,)
在settings.py文件添加 CELERYBEAT_SCHEDULE = { 'schedule-test': { 'task': 'app的名字.tasks.hello_celery', 'schedule': timedelta(seconds=3), 'args': (2,) }, }
启动: celery -A 你的工程名称 beat -l info(或者python manage.py celery beat --loglevel=info)
from celery.schedules import crontab crontab(minute=u'00', hour=u'11',day_of_week='mon,tue,wed,thu,sun') 示例如下: 'every-week-three-and-four-run-get_data_with_param':{ 'task': 'APP的名字.tasks.get_data_with_param', 'schedule': crontab(day_of_week="3, 4"), 'args':(4, ) }
注意:
如果只开启定时服务 没有开启worker服务 那么定时任务会被放入任务队列,但是由于没有干活儿的worker 那么任务是不会被执行,当worker服务被启动后 会立刻去任务队列领任务并执行
#<分钟> <小时> <日> <月份> <星期> <命令> */1 * * * * date>>a.txt #用date>>~/crontest可以很清楚的看到测试的效果 5 * * * * ls #指定每小时的第5分钟执行一次ls命令 30 5 * * * ls #指定每天的 5:30 执行ls命令 30 7 8 * * ls #指定每月8号的7:30分执行ls命令 30 5 8 6 * ls #指定每年的6月8日5:30执行ls命令 30 6 * * 0 ls #指定每星期日的6:30执行ls命令【注:0表示星期天,1表示星期1。星期也可以用英文来表示,sun表示星期天,mon表示星期一等。】 30 3 10,20 * * ls #每月10号及20号的3:30执行ls命令【注:“,”用来连接多个不连续的时段】 25 8-11 * * * ls #每天8-11点的第25分钟执行ls命令【注:“-”用来连接连续的时段】 */15 * * * * ls #每15分钟执行一次ls命令【即每个小时的第0 15 30 45 60分钟执行ls命令】 30 6 */10 * * ls #每个月中,每隔10天6:30执行一次ls命令【即每月的1、11、21、31日是的6:30执行一次ls 命令。】 50 7 * * * root run-parts /etc/cron.daily #每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件【注:run-parts参数表示执行后面目录中的所有可执行文件。】 重启服务 :/etc/init.d/cron restart 计划是分用户的,只对当前用户显示 */20 4 10,13 6-8 *
如果上面的重启方式不成功, 重启任务: /sbin/service crond restart