1. Celery介绍
Celery安装
> pip install celery==4.4.7
>
> pip install eventlet==0.26.1
Celery介绍:
Celery 是一个 基于python的分布式异步任务队列,通过它可以轻松的实现任务的异步处理
Celery优点:
celery核心:
2.Celery简单使用
创建worker==
-
创建一个文件laufing.py
#实例化对象
from celery import Celery
# 第一个参数worker name
# broker 代理,消息中间件
app = Celery("myworker", broker="redis://:@localhost:6379/4")
#创建任务函数
@app.task
def task1():
print("正在执行任务...")
2.前台启动worker进程。 在cmd 命令行输入如下:
celery -A 应用名 worker --loglevel=info -P eventlet
3.模拟django发送任务
ipython中模拟发送任务:在laufing.py的同级目录打开一个cmd命令行。
4.任务在worker进程中执行。
3. Celery存储任务结果
-
创建一个task.py文件,并创建worker
from celery import Celery
app=Celery("guojunchang",broker="redis://127.0.0.1:6379/5",
backend="redis://127.0.0.1:6379/4")
@app.task
def task1(a, b):
print("简单求和")
return a + b
@app.task
def task2(a, b):
print("2-s后求和")
time.sleep(20)
return a + b
2.前台启动worker
celery -A laufing worker -l info -P eventlet
3.发送任务,并获取结果 ipython中测试
from laufing import task1, task2
r1 = task1.delay(3, 5) # 发送任务
r1.result
r2 = task2.delay(4, 7) #发送任务,并立即执行下一行,不会阻塞
r2.result # worker来执行task,返回结果后才可以拿到
4. celery异步发送短信
-
在django项目主应用下创建celery.py文件,配置以下内容:
from celery import Celery
import os
from django.conf import settings
# 为celery配置环境变量,识别和加载django的配置文件
# 因为worker是脱离django启动的,且依赖其配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Zzw.settings')
#创建celery应用
app = Celery('myworker',broker='redis://127.0.0.1:6379/6',backend='redis://127.0.0.1:6379/7')
3. 在django项目子应用下,创建tasks.py
from Zzw.celery import app
from ronglian_sms_sdk import SmsSDK
from django.conf import settings
import json
#创建任务函数
@app.task
def send_message(sms_code,mobile,expire=5):
#实例化sdk
sdk=SmsSDK(settings.ACCID,settings.ACCTOKEN,settings.APPID)
#组织数据
tid='1' #短信模板
mobile='%s'%mobile #手机号转换为字符串
datas=('%s'%sms_code,'%s'%expire) #手机验证码
#发送短信,并解析响应
res = sdk.sendMessage(tid=tid,mobile=mobile,datas=datas)
return res
4.视图中发送异步任务
#发送短信的视图
class MaaAPIVew(APIView):
def post(self,request):
#1. 接收前端传来的数据
moblie=request.data.get('mobile')
# 数据校验
if not all([moblie, ]):
return Response({'code':400,'error':'数据错误'})
# 2. 生成短信验证码
sms_code='%d'%random.randint(10000,99999)
#存储短信验证码
redis_conn=redis.Redis(host='localhost',port=6379,db=3)
redis_conn.set(moblie,sms_code,ex=300)
#3. 请求容联云发送短信
res=send_message.delay(sms_code,moblie)
return Response({'code':200,'msg':'短信已发送,请注意查收'})
验证短信验证码的视图
#验证短信验证码
class SmsAPIVew(APIView):
def post(self,request):
#接收前端数据
sms_code=request.data.get('sms_code')
uuid_=request.data.get('code_id')
#查询redis 拿出存储的短信验证码
redis_conn=redis.Redis(host='localhost',port=6379,db=3)
stored_sms_code=redis_conn.get(uuid_)
#判断
if stored_sms_code and stored_sms_code.decode() ==sms_code:
return Response({'code':200,'msg':'对比成功'})
else:
return Response({'code':400,'error':'对比失败'})
在django终端启动celery
# windows系统下启动
celery -A mdpro worker -l info -P eventlet
今日报错
解决
把py文件放到了一个文件夹里,就正常运行了,醉了啊/(ㄒoㄒ)/~~