Windows10 下使用 celery 使用和配置redis---坑点记录

celery 简介

1.首先介绍一下celery:

Celery 是一个异步任务队列。一个Celery安装有三个核心组件:

Celery 客户端: 用于发布后台作业。当与 Flask 一起工作的时候,客户端与 Flask 应用一起运行。

Celery workers: 运行后台作业的进程。Celery 支持本地和远程的 workers,可以在 Flask 服务器上启动一个单独的 worker,也可以在远程服务器上启动worker,需要拷贝代码;

消息代理: 客户端通过消息队列和 workers 进行通信,Celery 支持多种方式来实现这些队列。最常用的代理就是 RabbitMQ 和 Redis。

Redis 配置

一定要关闭保护模式,避免不必要的麻烦

详细配置和介绍请看这里:redis超全配置介绍

# 关闭保护模式
protected-mode "no"  
# 监听IP:默认为 127.0.0.1
# 如果需要远程访问,可将此⾏注释,或绑定⼀个真实IP
#  bind 127.0.0.1 注销掉 设置为其它主机都可以连接
# 监听端⼝:默认为 6379 
port 6379
# 是否以守护进程运⾏,默认为 yes
daemonize yes
# Redis 中数据持久化保存时的文件
dbfilename dump.rdb
# dump.rdb 文件所在的目录
dir /var/lib/redis
# Redis 输出⽇志⽂件路径
logfile /var/log/redis/redis-server.log
# Redis 中的数据库数量,默认为 16,编号为:0-15
databases 16

2. 生产者和消费者设计模式

最常用的解耦方式之一,是寻找 中间人(broker) 搭桥,保证两个业务没有直接关联,我们称这一解耦方式为:生产者消费者设计模式。

img

生产者消费者设计模式的具体执行流程如下:

生产者一方发出任务消息(通知),任务消息存入消息队列,生产者继续做自己的事情
消费者一方监听消息队列,取出对应的任务消息(通知),根据消息去执行对应的任务
短信验证码发送的异步解决方案:

img

短信发送API一方(生产者)发出发送短信的任务消息,任务消息存入消息队列,然后短信发送API给客户端返回响应
短发发送工作者一方(消费者)监听消息队列,取出对应的任务消息,根据消息进行短信验证码的实际发送

3. Celery-分布式消息队列系统

Celery是一个简单、灵活的分布式消息队列系统,使用python语言开发。Celery的本质就是生产者-消费者设计模式,使用Celery可以非常方便的实现异步任务的执行。

3.1 Celery核心三要素

核心要素 作用说明
client 生产者,发出任务消息,存储到broker
broker 中间人,消息队列,存储任务消息,官方推荐使用rabbit-mq或redis
worker 消费者,任务执行者,根据任务消息执行对应的任务

3.2 Celery基本使用

环境安装:

1)进入自己的虚拟环境,安装Celery包和eventlet(win10环境下)
window10需要插件eventlet

pip install celery==4.4.7
pip install eventlet

代码编写:

1)随便位置创建一个目录 celery_tasks,并在这个目录下创建一个 main.py 文件和一个 config.py 文件(创建文件可以使用pycharm 或者自己直接创建)

mkdir celery_tasks
touch main.py config.py

在这里插入图片描述

2)编辑 config.py 文件,在其中添加配置项,指定Celery broker 的地址,代码如下:

# 指定broker中间人(消息队列)地址,本示例使用redis作为broker
# 格式:broker_url='redis://<redis-ip>:<redis-port>/<db>'
# 注意:将192.168.19.131改成自己的redis数据库ip,并且redis数据库一定要启动!!!
broker_url='redis://192.168.19.131:6379/3'

3)编辑 main.py 文件,在启动创建 Celery 对象,并加载 config.py 中的配置

from celery import Celery

# ①  创建Celery对象
celery_app = Celery('demo')

# ②  加载config.py的配置
celery_app.config_from_object('celery_tasks.config')

4)在 celery_tasks 目录下,创建一个任务目录 sms,同时在 sms 目录下创建一个任务文件 tasks.py

mkdir sms
touch init.py tasks.py
img

5)编辑 sms/tasks.py,在其中添加一个任务函数

# 导入Celery对象
from celery_tasks.main import celery_app
# @celery_app.task("任务名称")
@celery_app.task(name = "send_sms_code")
def send_sms_code(mobile, sms_code):
    """封装任务函数代码"""
    print("发送短信任务函数代码...")

6)回去编辑 main.py 文件,设置celery worker启动时自动加载 sms/tasks.py 中的任务函数

from celery import Celery
# ①  创建Celery对象
celery_app = Celery('demo')

# ②  加载config.py的配置
celery_app.config_from_object('celery_tasks.config')

# ③  celery worker启动时自动加载任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])
worker启动:

1)上面代码编写完成之后,我们可以对celery进行测试,首先需要启动celery的 worker,命令如下:

# 注意:
# ① 确保自己提取进入了安装celery的虚拟环境
# ② 下面的worker启动命令,一定要在 celery_tasks目录 的上级执行!!!
celery -A celery_tasks.main worker -l info -P eventlet
# 如果出现warning -n [option] 无需理会
2)celery worker 启动之后,提示信息如下:

img

任务消息发出:

celery worker 启动之后,client可以向 broker 中发出任务消息,celery worker 收到任务消息之后,就会执行对应的任务函数。下面我们来演示通知 celery worker 执行 send_sms_code 任务函数:

1)在虚拟机环境中进入 celery_tasks 的上级目录,进入python交互终端,执行如下操作:

python
>>> from celery_tasks.sms.tasks import send_sms_code
>>> send_sms_code.delay('13566667788', '135268')

2)执行效果如下:

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值