Celery 是一个异步任务队列。一个Celery安装有三个核心组件:
Celery 客户端: 用于发布后台作业。当与 Flask 一起工作的时候,客户端与 Flask 应用一起运行。
Celery workers: 运行后台作业的进程。Celery 支持本地和远程的 workers,可以在 Flask 服务器上启动一个单独的 worker,也可以在远程服务器上启动worker,需要拷贝代码;
消息代理: 客户端通过消息队列和 workers 进行通信,Celery 支持多种方式来实现这些队列。最常用的代理就是 RabbitMQ 和 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
最常用的解耦方式之一,是寻找 中间人(broker) 搭桥,保证两个业务没有直接关联,我们称这一解耦方式为:生产者消费者设计模式。
生产者消费者设计模式的具体执行流程如下:
生产者一方发出任务消息(通知),任务消息存入消息队列,生产者继续做自己的事情
消费者一方监听消息队列,取出对应的任务消息(通知),根据消息去执行对应的任务
短信验证码发送的异步解决方案:
短信发送API一方(生产者)发出发送短信的任务消息,任务消息存入消息队列,然后短信发送API给客户端返回响应
短发发送工作者一方(消费者)监听消息队列,取出对应的任务消息,根据消息进行短信验证码的实际发送
Celery是一个简单、灵活的分布式消息队列系统,使用python语言开发。Celery的本质就是生产者-消费者设计模式,使用Celery可以非常方便的实现异步任务的执行。
核心要素 作用说明
client 生产者,发出任务消息,存储到broker
broker 中间人,消息队列,存储任务消息,官方推荐使用rabbit-mq或redis
worker 消费者,任务执行者,根据任务消息执行对应的任务
环境安装:
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://:/'
# 注意:将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
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 启动之后,提示信息如下:
任务消息发出:
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)执行效果如下: