django中celery的配置及使用

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(对应函数的参数)这是调用的格式)

扫描二维码关注公众号,回复: 3409410 查看本文章
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(均亲测有效)

猜你喜欢

转载自blog.csdn.net/qq_16069927/article/details/82056293