Celery异步发送短信

Celery安装

celery,分布式异步任务队列
eventlet,并发网络库 gevent 协程库

pip install celery==4.4.7

pip install eventlet==0.26.1

Celery介绍

Celery 是一个 基于python的分布式异步任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景:

  • 异步任务:将耗时的操作任务提交给Celery异步执行,比如发送短信/邮件、消息推送、音频处理等等
  • 做一个定时任务,比如每天定时执行爬虫爬取指定内容
  • 还可以使用celery实现简单的分布式爬虫系统等等

Celery 在执行任务时需要通过一个消息中间件(Broker)来接收和发送任务消息,以及存储任务结果

Celery有以下优点:

  • 简单:Celery 易于使用和维护,并且它 不需要配置文件 ,并且配置和使用还是比较简单的
  • 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
  • 快速:单个 Celery 进程每分钟可处理数以百万计的任务,而保持往返延迟在亚毫秒级
  • 灵活: Celery 几乎所有部分都可以扩展或单独使用,各个部分可以自定义。

## Celery存储任务结果

  1. 创建一个laufing.py文件,并创建worker
from celery  import Celery

app = Celery("worker2", broker="redis://:laufing@localhost:6379/4", backend="redis://:laufing@localhost:6379/5")

@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
  1. 前台启动worker
# windows 下需要加-P eventlet  或者 -P gevent
#因为celery 4.x 对window支持的不太好
celery -A laufing worker --loglevel=info -P eventlet
#window
celery -A laufing worker -l info -P eventlet
  1. 发送任务,并获取结果
    ipython中测试如下:
from laufing import task1, task2

r1 = task1.delay(3, 5)  # 发送任务
r1.result

r2 = task2.delay(4, 7) #发送任务,并立即执行下一行,不会阻塞
r2.result   # worker来执行task,返回结果后才可以拿到

分布式的worker:只需在多个主机上启动该laufing下的worker即可, 每一个worker进程都是并发处理任务

celery异步发送短信

在django项目根目录下创建celery.py以及config.py文件,配置以下内容:
config.py文件:

broker_url='redis://:redis密码@127.0.0.1:6379/5'
result_backend='redis://:redis密码@127.0.0.1:6379/6'

celery.py文件:

from celery import Celery
from django.conf import settings
import os

#配置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE','p6_306.settings')

#实例化celery对象
app=Celery('cc')
#通过配置文件进行配置
app.config_from_object('p6_306.config')

# 让app自动发现任务函数
app.autodiscover_tasks(settings.INSTALLED_APPS)

在django项目子应用下,创建tasks.py

from p6_306.celery import app
from ronglian_sms_sdk import SmsSDK
import json
accId='8aaf07088185853e01*******'
accToken='8ac934ad5ddf44a4a*********'
appId='8aaf07088185853e018********'
#定义任务函数
@app.task
#AUTH TOKEN: 8ac934ad5ddf44a4a1b********
# ACCOUNT SID:8aaf07088185853e0181********
# AppID(默认):8aaf07088185853e01**********
#定义发送短信的函数
def send_message(sms_code,mobile,expire=5):
    """
    :param sms_code:  要发送的验证码
    :param mobile:    发送手机号
    :param expire:    过期时间
    :return:
    """
    # 实例化sdk对象
    sdk=SmsSDK(accId=accId,accToken=accToken,appId=appId)
    #准备数据
    tid='1'
    datas=('%s'%sms_code,'%s'%expire)
    #发送短信
    res=sdk.sendMessage(tid=tid,mobile=mobile,datas=datas)
    data =json.loads(res)
    print('容联云解析的数据:',data)
    # if data.get('statusCode')=='000000':
    #     #     return True
    #     # return False
    return data

编写视图类

from rest_framework.views import APIView
from rest_framework.response import Response
import random,redis
from .tasks import send_message
class SmsCodeAPIView(APIView):
    #发送短信验证码
    def get(self,request):
        #获取前端的手机号
        mobile=request.query_params.get('mobile')
        #生成随机验证码
        sms_code=random.randint(10000,99999)
        
        # 发送短信,异步任务
        send_message.delay(sms_code, mobile)
        redis_conn = redis.Redis(host='localhost', port=6379, password='shayebushi')
        key='sms_%s'%mobile
        redis_conn.set(key,sms_code,ex=300)
        return Response({'code': 200, 'msg': '发送短信,注意查收'})
    #启动指令
    # celery -A p6_306 worker -l info -P eventlet

    # 验证短信验证码
    def post(self,request):
        #1.获取前端的手机号,验证码
        mobile=request.data.get('mobile')
        sms_code=request.data.get('smsCode')
        # 2.获取存储的验证码
        redis_conn=redis.Redis(host='localhost',port=6379,password='shayebushi')
        key='sms_%s'%mobile
        stored_code=redis_conn.get(key)
        #3.判断验证码是否一致
        if stored_code and stored_code.decode()==sms_code:
            return Response({'code':200,'msg':'验证成功'})

        return Response({'code':400,'msg':'验证失败'})

配置路由

from django.urls import path
from users import views
urlpatterns = [
    #获取短信验证码
    path('sms_code/',views.SmsCodeAPIView.as_view())
]

启动celery

# windows系统下启动
celery -A mdpro worker -l info -P eventlet

# mac下启动,
celery -A mdpro worker -l info
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Celery是一个Python的分布式任务队列框架,它可以用来实现异步任务的调度与执行。使用Celery,你可以将耗时的任务放入任务队列中,然后由后台的工作进程异步执行,这样可以提高系统的并发能力和响应速度。 要使用Celery,首先需要安装Celery库。你可以使用pip命令进行安装: ``` pip install celery``` 接下来,你需要创建一个Celery实例,并定义任务函数。任务函数可以是任何可调用对象,通常是一个Python函数。例如,下面是一个简单的示例: ```pythonfrom celery import Celery# 创建Celery实例app = Celery('myapp', broker='redis://localhost:6379/0') # 定义任务函数@app.taskdef add(x, y): return x + y``` 在上面的示例中,我们创建了一个名为`myapp`的Celery实例,并指定了一个Redis作为消息代理(broker)。然后,我们定义了一个名为`add`的任务函数,使用`@app.task`装饰器来将其注册为Celery任务。 接下来,你可以使用`delay()`方法调用任务函数,将任务放入任务队列中异步执行: ```pythonresult = add.delay(4,6) ``` 在上面的示例中,我们使用`delay()`方法调用了`add`任务,并传递了两个参数4和6。这会将任务添加到Celery的任务队列中,并返回一个`AsyncResult`对象,你可以使用它来获取任务的执行结果。 当任务被放入任务队列后,你需要启动Celery的工作进程来执行任务。可以使用以下命令启动工作进程: ``` celery -A myapp worker --loglevel=info``` 上面的命令中,`-A`参数指定了Celery实例所在的模块(在这个例子中是`myapp`),`--loglevel=info`参数指定了日志级别为info。 这只是Celery的一些基本用法,还有很多其他功能和配置可以探索。你可以查阅Celery的官方文档来获取更多详细信息:https://docs.celeryproject.org/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值