Celery的初步使用

1. 简介

Celery是由Python开发、简单、灵活、可靠的分布式任务队列,其本质是生产者消费者模型,Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务处理需要通过其他方式(前端的一般解决方案是ajax操作),而后台Celery就是不错的选择。

优点:

  • 简单:熟悉celery的工作流程后,配置使用简单
  • 高可用:当任务执行失败或执行过程中发生连接中断,celery会自动尝试重新执行任务
  • 快速:一个单进程的celery每分钟可处理上百万个任务
  • 灵活:几乎celery的各个组件都可以被扩展及自定制

2. 工作原理

在这里插入图片描述
Task
任务: 有异步任务和定时任务

Broker
消息中间件Broker,,接收Task,将任务存到队列。RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等又可以做中间人。

Worker
任务执行单元,负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。

Backend
结果存储,RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch都可以作为储存方式

3. 安装使用

这里我使用的是redis作为消息中间件

3.1 Celery安装

pip install -U Celery

3.2 简单使用:

项目目录

在项目文件夹下创建一个python package 文件夹,取名为celert_tasks,创建一个main.py文件和config.py文件,最后创建发送email的任务的文件夹,在里面在创建一个task.py文件,目录如下。
在这里插入图片描述

config.py :Celery相关配置文件

config.py里面的内容需要大写,还有redis的数据库不要用已经被使用过的

# 配置文件

BROKER_URL = 'redis://127.0.0.1/5'

main.py 文件内容:

# 启动文件

from celery import Celery

# 告知celery 使用django的配置文件进行配置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = "shanghuiproject.settings.dev"

# 创建应用
app = Celery('shanghui')
# 导入celery的配置文件
app.config_from_object('celery_tasks.config')

# 任务
app.autodiscover_tasks(['celery_tasks.msg','celery_tasks.email'])

# 终端启动任务
#  celery -A 任务模块名 worker -l info

创建模块任务

之前在celery_tasks文件夹中创建新的文件夹email和msg分别用来存放发送验证邮件和短信的任务

以发送验证邮件为例子
在email文件夹里创建tasks.py文件:

# 在当前的tasks里面书写邮件发送任务
from django.core.mail import send_mail
from django.conf import settings
from celery_tasks.main import app


@app.task(name='send_mail')
def send_email(email, url):
    print('进入send_email任务')
    subject = '新的传奇'  # 邮件主题
    message = '点击链接激活邮箱:'  # 邮件内容
    sender = settings.EMAIL_FROM  # 邮件发送者
    receiver = [email,]  # 接收邮件的邮箱
    url_string = '<a href=' + url + '>点击链接</a>'
    send_mail(subject=subject, message=message, from_email=sender, recipient_list=receiver,html_message=url_string)

去对应的 serializers.py 文件 修改代码:

from celery_tasks.email.tasks import send_email

url = 'http://127.0.0.1:8000/users/varifyemail/?token='+token
to_email = validated_data['email']
	try:
		send_email.delay(to_email, url)
	except Exception as e:
		print(e)

在终端输入下面代码启动工作者

celery -A 任务模块名 worker -l info

猜你喜欢

转载自blog.csdn.net/dakengbi/article/details/93109429