celery 涉及到三个东西:异步的项目、worker(执行异步任务的进程,其作用是从redis中获取异步任务并执行)、broker(代理人,这里用redis做broker,其作用是将需要执行异步或定时任务添加到redis队列中)
Celery大于3.1.25的版本不再支持Windows。Windows下推荐安装 3.1.25。(因为我使用的 Windows,这里就以3.1.25为例)
一、安装django-celery和django-redis pip install django-celery django-redis
二、INSTALLED_APPS中加入 djcelery
INSTALLED_APPS = [
...
'djcelery', #加入djcelery
]
三、在settings.py 中加入celery配置信息
######django-celery配置######
import djcelery
from celery.schedules import timedelta,crontab
djcelery.setup_loader() # 开始加载当前所有安装app中的task
# 使用redis代理来分发任务
BROKER_URL = 'redis://127.0.0.1:6379/8'
CELERY_IMPORTS = ('post.tasks') # 导入任务,可以执行的异步任务
CELERY_TIMEZONE = 'Asia/Shanghai' # 中国时区
# 任务存入到数据库中
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
# 定时器策略
CELERYBEAT_SCHEDULE = {
# 定时任务一:每隔30s运行一次
u'邮件发送': {
"task": "post.tasks.tsend_email", # 有必要注意该位置的post指tasks.py所在文件夹tsend_email为异步函数之一
# "schedule": crontab(minute='*/2'),
"schedule": timedelta(seconds=5),
"args": (),
},
u'性能计算': {
"task": "post.tasks.add",
"schedule": crontab(minute='*/2'),
"args": (1, 4),
},
}
#####django-celery end########
四、在主工程目录添加celery.py
# encoding: utf-8
from __future__ import absolute_import # 避免就近原则
import os
from celery import Celery
from django.conf import settings
# 设置项目运行的环境变量DJANGO_SETTINGS_MODULE
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"DAdmin.settings") # DAdmin为settings所在的文件(模块)
#创建celery应用
app = Celery('AdminCelery')
# Celery加载配置
app.config_from_object('django.conf:settings')
# 如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。
# 比如你添加了一个任务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)
五、在自己的app中创建任务 tasks.py
# coding:utf-8
import time
from DAdmin.celery import app #导入celery的实例对象
@app.task
def tsend_email():
time.sleep(10)
print('send email ok!')
@app.task
def add(x, y):
time.sleep(5)
return x+y
六、迁移生成celery需要的数据表(必做的步骤)
在终端输入 python manage.py makemigrations 做迁移计划并通过 python manage.py migrate 迁移至mysql数据库
七、在views.py中的某一请求处理函数中,调用tasks.py中任务(函数名.delay(对应函数的参数)这是调用的格式)
from post.tasks import tsend_email,add
def sendmail(request):
...
tsend_email.delay() # 执行任务
# add.delay(1,2) # delay(add函数的参数列表)
return HttpResponse(json.dumps({'status':'ok'}), 'application/json')
八、启动相关服务
先启动项目 python manage.py runserver
再启动celery ① python manage.py celery worker -l info (不会启动定时任务)
② python manage.py celery -A 项目名 worker -B -l info (默认会主动 启动 项目名.celery,即会启动定时任务,其中-B在windows上不支持)
③ 如果在windows下可以分开启动 异步任务的启动命令为①或者celery -A 项目名 worker -l info,定时任务的启动命令为 python manage.py celery -A 项目名 beat -l info 或者 celery -A 项目名 beat -l info(均亲测有效)