一、安装
注意:包的版本方面有要求,不然搭建好后运行会报错,以下是本次使用版本,可运行
1.pip安装 celery==3.1.20,django-celery==3.3.1, redis==2.8.0,redis版本安装在3以下(使用此套发现定时任务cpu占用大)
2. 发现cpu大的话,django-celery降到django-celery==3.2.2
二、配置及编写测试文件
1. 在与settings平级的目录下,新建celery.py文件
# !/usr/bin/env python
# encoding: utf-8
# 目的是拒绝隐式引入,celery.py和celery冲突。
from __future__ import absolute_import ,unicode_literals
import os
from celery import Celery
from django.conf import settings
# 设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "opetation.settings") # 改项目名
# 创建celery应用
app = Celery('opetation') # 名称可随意更改
app.config_from_object('django.conf:settings')
# 如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request)) #dumps its own request information
2. app应用下创建tasks.py,当apps下有多个app应用时,每个app下都可以创建tasks.py,如上所说,会自动检索
tasks.py内容
# !/usr/bin/env python
# encoding: utf-8
from __future__ import absolute_import
import datetime
import time
import traceback
from celery import shared_task, platforms
platforms.C_FORCE_ROOT = True # 若执行时报错root用户不能执行,加上这一行
@shared_task
def test(x, y):
print
time.sleep(5)
return "end:结果-%s" % (x + y)
@shared_task
def add(x, y):
return x + y
@shared_task
def send_message():
print "执行send_message......"
now_str = datetime.datetime.now().__str__()
print "当前执行时间:{}".format(now_str)
问题解决:使用python3+django2.0时,异步时,不进入异步函数
方案:将@shared_task改为@app.task后重启解决,注意app导包,导入上面第一步,新建的celery.py文件中的app
3. settings.py中配置
from __future__ import absolute_import # 防止celery.py与celery冲突
from celery.schedules import crontab
from celery.schedules import timedelta
# celery配置
import djcelery
djcelery.setup_loader()
CELERY_TIMEZONE='Asia/Shanghai' # TIME_ZONE配置保持一致
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # celery处理器
BROKER_BACKEND='redis'
BROKER_URL='redis://localhost:6379/1'
CELERY_RESULT_BACKEND='redis://localhost:6379/2'
# 定时周期任务的配置
CELERYBEAT_SCHEDULE = {
"send_message":{
"task":"app.tasks.send_message", # app名.tasks.方法名
"schedule":timedelta(seconds=10) # 每隔10秒执行
},
"test_task": {
"task": "app.tasks.test",
"schedule": crontab(hour=11, minute=28) # 每天的11点28分执行一次任务
}
}
4. 异步的使用,在view.py中编写逻辑,配置urls路由后,访问使用
5. 命令及运行查看
# 异步执行
# python manage.py celery worker -c 6 -l debug
# 定时执行,可能会报错没有beat_table表, 执行python manage.py migrate
# python manage.py celery beat -l INFO
若有报错,可上网搜索,基本都能找到解决方案。