django-celery的配置及使用

Celery简介

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理

celery的应用

异步调用:那些用户不关心的但是又存在在我们API里面的操作 我们就可以用异步调用的方式来优化(发送邮件 或者上传头像)

​定时任务:定期去统计日志,数据备份,或者其他的统计任务

相关概念

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'
settings.py文件

settings.py的同级目录下新建celery.py

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(一定不要写错)文件
celery.py

settings.py同级目录下的init.py加入

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__init__.py

使用

1、在需要使用异步任务的APP目录下新建tasks.py

from celery import task
import time

@task
def hello_celery(loop):
    for i in range(loop):
        print 'hello'
        time.sleep(2)
tasks.py

2、views.py内的调用

任务函数名.delay(参数,,,,)

3、python manage.py migrate 建表(不要忘记建表)

4、启动worker

python manage.py celery worker --loglevel=info (或者celery -A 你的工程名 worker -l info)

注意:修改tasks.py的内容后 要重启celery的服务(命令:python manage.py celery worker --loglevel=info)

定时任务

在settings.py文件添加
CELERYBEAT_SCHEDULE = {
    'schedule-test': {
        'task': 'app的名字.tasks.hello_celery',
        'schedule': timedelta(seconds=3),
        'args': (2,)
    },

}
settings.py

启动: 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(python manage.py celery worker --loglevel=info)

​ 如果只开启定时服务 没有开启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

posted @ 2018-11-29 20:24  Sakura_L  阅读(1459)  评论(1编辑  收藏  举报