django中使用celery(分布式任务队列)

写在前面

celery官网:

https://docs.celeryproject.org/en/master/index.html

celery- redis官网:

https://docs.celeryproject.org/en/master/getting-started/brokers/redis.html

celery- django官网:

https://docs.celeryproject.org/en/master/django/first-steps-with-django.html

Celery介绍:


Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统

专注于实时处理的异步任务队列

同时也支持任务调度

1、开始使用

1.1、安装celery redis:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U celery[redis]

这里用的国内镜像
在这里插入图片描述

1.2、安装celery

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U celery

在这里插入图片描述

1.3、开始写代码

新建doc/code文件夹
在这里插入图片描述
新建一个测试文件tasks.py
在这里插入图片描述

from celery import Celery


# "tasks"任务名字,broker=消息载体
app = Celery("tasks", broker="redis://localhost:6379/1")


@app.task
def add(a, b):
    return a+b

1.3.1、开启celery服务

进入doc/code
在这里插入图片描述
开起celery服务:celery -A tasks worker --loglevel=info
在这里插入图片描述
loglevel,表表示消息等级,有下面这几个值
在这里插入图片描述

1.3.2、测试运行

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

1.3.3、异步测耗时

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

2、django中使用celery

注意:
django1.8及以上使用celery4.0版本
django1.8及以下使用celery3.8版本

下载celery官方代码:

https://github.com/celery/celery.git

下载后解压,并用pycharm打开django样例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
展开项目(刚打开可能有报红,可能是因为某些包没有安装)
在这里插入图片描述
修改setting.py
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1、尝试运行

路由
在这里插入图片描述
视图
在这里插入图片描述
迁移

python manage.py makemigrations
python manage.py migrate

在这里插入图片描述
运行
在这里插入图片描述
访问:成功访问
在这里插入图片描述

2.2、运行celery服务

成功运行celery服务之前,可能会出现两个问题,
1:redis没有安装,2:pip需要更新,下面两行指令可以解决
pip install redis
python -m pip install --upgrade pip

celery -A proj worker --loglevel=info

在这里插入图片描述

2.3、异步测试

在函数中写一个sleep()模仿耗时
在这里插入图片描述
路由
在这里插入图片描述
视图
在这里插入图片描述

def index(request):
    result = add(2, 3)
    return HttpResponse(result)


def async_1(request):
    result = add.delay(5, 6)
    return HttpResponse(result)

重启celery服务
Ctrl+c 停止
在这里插入图片描述
重启:celery -A proj worker --loglevel=info
在这里插入图片描述
运行项目
在这里插入图片描述
访问:http://127.0.0.1:8000/index/
在这里插入图片描述
访问:http://127.0.0.1:8000/async/
在这里插入图片描述

3、django中使用celery实例:异步发送邮件

返回之前创建的项目,新建一个发送邮件的app:python manage.py startapp sendemail
在这里插入图片描述
关闭debug
在这里插入图片描述
在项目文件新建celery.py,注意是项目文件夹REST02里面不是sendemail里面
在这里插入图片描述
celery.py
在这里插入图片描述

import os

from celery import Celery

# 注意,'REST02'这里是项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'REST02.settings')

# 注意,'REST02'这里是项目名
app = Celery('REST02')

app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

修改__init__.py
在这里插入图片描述
安装results模块:pip install django-celery-results
在这里插入图片描述
settings.py
在这里插入图片描述
在这里插入图片描述

CELERY_BROKER_URL = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'

3.1、先写一个加法测试异步

在sendemail里面创建异步任务tasks.py:先写一个加法测试
在这里插入图片描述

from time import sleep

from celery import shared_task


@shared_task
def add(a, b):
    sleep(5)
    return a+b

分配路由
在这里插入图片描述
在sendemail写一个路由urls.py
在这里插入图片描述

from sendemail import views
from django.urls import path

urlpatterns = [
    path('index/', views.index),
    path('async/', views.async_1),

]

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

from django.http import HttpResponse
from sendemail.tests import add


def index(request):
    result = add(1, 2)
    return HttpResponse(result)


def async_1(request):
    result = add.delay(3, 6)
    return HttpResponse(result)

迁移:生成celey异步需要的库

python manage.py makemigrations
python manage.py migrate

在cmd中启动redis:redis-server.exe redis.windows.conf
在这里插入图片描述

如果没安装reids,redis下载安装:https://blog.csdn.net/a__int__/article/details/103648033

启动celery服务:celery -A REST02 worker --loglevel=info
在这里插入图片描述
启动django项目

在这里插入图片描述
访问路由:
在这里插入图片描述
在这里插入图片描述

3.2、异步发送邮件

配置setting
在这里插入图片描述

# 这里记得改
EMAIL_HOST_USER = "发送方邮箱账号@163.com"
# 这里记得改
EMAIL_HOST_PASSWORD = "授权码"
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = 465
EMAIL_USE_SSL = True

tasts.py
在这里插入图片描述

@shared_task
def send_email(receive):
    subjiect = "收到邮件了吗"
    msg = "这是邮件的内容"
    # 这里记得改
    from_email = "发送方邮箱账号@163.com"
    rec_list= (receive,)
    send_mail(subjiect, msg, from_email, rec_list)

路由
在这里插入图片描述
视图
在这里插入图片描述

def email(request):
    mail_address = request.GET.get('address')
    send_result = send_email.delay(mail_address)
    return HttpResponse(send_result)

重启celery:celery -A REST02 worker --loglevel=info
在这里插入图片描述
启动django

在这里插入图片描述
在浏览器发送一个邮件试试
在这里插入图片描述
在这里插入图片描述
成功收到邮件
在这里插入图片描述

发布了136 篇原创文章 · 获赞 30 · 访问量 7100

猜你喜欢

转载自blog.csdn.net/a__int__/article/details/104183077