Django 使用celery框架实现异步任务

一、Django 异步编程

在之前的开发过程当中,django都是使用单线程结构,比如,请求一个视图,视图向数据库写入30000条数据,那么整个页面进入等待状态,类似的需求是有的,但是用户体验不可以是这样:

  • 比如,发短信
  • 比如,django调用爬虫
  • 比如,大规模数据写入

异步编程的底层可以用多线程实现,但是在开发当前有一个很成熟的异步编程框架加载 celery,我们要是用的是django封装好的celery框架,django-celery。

二、celery框架认识

celery 是一个简单的,灵活的,可靠的python编写处理大量消息的分布式系统。

分布式:就是将任务分发个多个客户端进行处理的模式。通常在python当中使用的分布式有两种:

  • 1、redis分布式,利用redis广告模式进行分布式
  • 2、使用celery进行分布式

分布式开发,一定涉及一个设计模式:生产消费者模式

celery 基本原理
在这里插入图片描述

使用celery需要的组件
1、pip install celery
2、需要消息队列

  • rabbitmq 消息队列
  • Redis
  • 其他数据库

在整个celery开发的过程当中要有存放任务的容器,这个容器可以是redis数据库,可以是其他数据库,还可以是rabbitmq消息队列。如果任务有结果还需要设置一个容器来存放结果。

在这里插入图片描述
在这里插入图片描述

三、Django-celery部署安装

使用django-celery+redis进行异步任务处理
1、安装包

pip install django-celery=3.2.2
pip install django-redis=4.10.0
pip install redis==2.10.6
pip install flower #可视化平台

2、配置setting
安装App
在这里插入图片描述

全局配置

# celery配置
import djcelery  # 导入django-celery模块
djcelery.setup_loader()  # 加载模块
BROKER_URL = 'redis://127.0.0.1:6379/1'  # 任务容器地址,Redis数据库地址
CELERY_IMPORTS = ('CeleryTask.tasks')  # 具体的任务文件
CELERY_TIMEZONE = 'Asia/Shanghai'  # celery时区
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'  # celery处理器

3、给celery创建独立的app

python manage.py startapp CeleryTask

4、在项目的主目录下编写celery控制文件
在这里插入图片描述

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings



# 设置celery执行的环境变量,执行django项目的配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE","CeleryTask.settings")

# 创建celery应用
app = Celery('celely_task')  # celery应用的名称
app.config_from_object('django.conf:settings')  # 加载的配置文件


# 如果在工程的应用中创建了tasks.py模块,那么Celery应用就会自动去检索创建的任务。比如你添加了一个任#务,在django中会实时地检索出来。
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

5、在CeleryTask App下编写任务文件,文件名必须是tasks.py
在这里插入图片描述

from __future__ import absolute_import
import requests
import json
from DjangoShop.celery import app  # 在安装celery框架成功后,django新生成的模块

@app.task # 将taskExample转换为一个任务
def taskExample():
    print("send email ok!")

@app.task
def add(x=1,y=2):
    return x+y

@app.task
def DingTalk():
    url = "https://oapi.dingtalk.com/robot/send?access_token=3854f74dd13b9cc7ae451c13efdbd0dff0749bf822d792f53b0088f44ad7b37c"

    headers = {
        "Content-Type": "application/json",
        "Chartset": "utf-8"
    }

    requests_data = {
        "msgtype": "text",
        "text": {
            "content": "睡醒了吧,熊大。你亲爱的Mom正在路上了,快点起来了!"
        },
        "at": {
            "atMobiles": [
            ],
            "isAtAll": True
        }
    }

    sendData = json.dumps(requests_data)

    response = requests.post(url, headers=headers, data=sendData)

    content = response.json()

    print(content)

6、同步数据库

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述

同步数据后,数据库会多出如下数据表:
在这里插入图片描述

当配置完成celery之后python manage.py会多出很多命令
在这里插入图片描述

四、celery异步任务服务启动

1、必须先开启Django项目

2、启动celery之前必须先启动redis数据库服务

redis-server.exe redis.windows.conf

redis关闭要注意,关闭方式:

redis-cli.exe
shutdown

在这里插入图片描述

3、启动celery worker服务

python manage.py celery worker --loglevel=info
#简写:
python manage.py celery worker -l info

4、在视图当中触发一下celery任务
celery的任务需要用delay函数触发

# 触发celery任务的视图
from CeleryTask.tasks import add
from django.http import JsonResponse

def get_add(request):
    add.delay(5,7)
    return JsonResponse({"state":200})

访问视图对应路由触发:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孜孜孜孜不倦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值