Django项目总结:Celery

Celery

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

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

-- 同时也支持任务调度

-- https://www.jianshu.com/p/620052aadbff

-- 官网:https://docs.celeryproject.org/

 

-- 消息队列

  -- 异步任务

  -- 定时任务

-- 需要了解的知识

  -- 选择并安装消息容器(载体)=> RabbitMQ,Redis

  -- 安装Celery并创建第一个任务

  -- 开启工作进程并调用任务

  -- 记录工作状态和返回的结果

# 安装 celery[redis]
pip install -U "celery[redis]"

# 安装 celery
pip install celery

# 配置redis位置,配置缓存时已在 settings 配置
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
        'TIMEOUT': 60 * 60 * 24,
    }
}

# 创建应用和任务 doc/code/tasks.py

# 开启 celery worker 服务
cd doc/code/ 
celery -A tasks worker --loglevel=info

# 调用异步任务

 

 

 

 

在 Django 中使用 celery

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

-- 官方示例源码:https://github.com/celery/celery

-- 下载源码,用 pycharm 打开 example 中 Django 项目

# 将环境改为自己的环境
# 安装 sqlalchemy
pip install sqlalchemy -i https://pypi.douban.com/simple

# settings.py 修改成 redis 的地址
CELERY_BROKER_URL = 'redis://localhost:6379/1'

# 根/urls.py
urlpatterns = [
    url(r'^index/', views.index)
]

# views.py
def index(request):
    return HttpResponse('Hi')

# 执行迁移
python manage.py migrate

python manage.py runserver

# 开启 celery
celery -A 项目名 worker --loglevel=info

# celery 启动后出现黄字警告,关闭Debug

 

-- 将示例配置和信息导入到自己的项目中

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

 

-- 导入测试

根 / celery.py

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'RESTEnd.settings')

app = Celery('RESTEnd')

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))

 

sendemail / tasks.py

from time import sleep
from celery import shared_task


@shared_task
def add(a, b):

    print("计算中...")
    sleep(5)
    return a + b

 

sendemail / urls.py

from django.urls import path
from sendemail import views

urlpatterns = [
    path('index/', views.index),
    path('asy/', views.asy),
]

 

sendemail / views.py

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


def index(request):
    result = add(5, 6)
    return HttpResponse(result)

def asy(request):
    result = add.delay(50, 60)
    return HttpResponse(result)

 

异步邮件发送

sendemail / tasks.py

# 邮件发送
@shared_task
def send_email(receive):

    subject = '这是一封邮件'
    message = 'Yes'
    from_email = '邮件地址'
    recipient_list = (receive,)

    send_mail(subject, message, from_email, recipient_list)

 

sendemail / views.py

def email(request):

    mail_address = request.GET.get('address')

    send_result = send_email.delay(mail_address)

    return HttpResponse(send_result)

 

posted @ 2020-08-14 21:03  颗粒成仓  阅读(166)  评论(2编辑  收藏  举报