一、引言
1、生产者消费者模式的思考
- 消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
- 任务可能出现高并发的情况,需要补充多任务的方式执行。
- 耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。
- 取到的消息什么时候执行,以什么样的方式执行。
2、解决办法:
• 实际开发中,我们可以借助成熟的工具Celery来完成。
• 有了Celery,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。
二、celery介绍
1、celery 简介
- 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
- 单个 Celery 进程每分钟可处理数以百万计的任务。
- 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。
2、安装celery
pip install celery==4.4.7
三、创建Celery实例并加载配置
1、定义Celery包
- celery 可以脱离django使用
- 在根目录上定义celery包:celery_tasks
- main.py 类似Django的manage.py,是celery的入口文件
- config.py:配置文件
2、创建Celery实例:
# /celery_tasks/main.py
# celery启动文件
from celery import Celery
# 创建celery实例
celery_app = Celery('lg')
3、加载Celery配置
-将参数保存到 配置文件中:celery_tasks.config.py
# 指定消息队列的位置: redis 10号库
broker_url = "redis://127.0.0.1/10"
- 加载配置参数 celery_tasks.main.py中
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')
4、定义任务
-
定义的生产者 celery_app
-
定义了中间人:broker_url
-
消费者就是celery本身
-
还需要定义任务
- 一般每一个任务都存在独立的一个包中
- 如本例中发送短信,建立包 sms
- 在包中,必须创建一个tasks.py (文件名必须是tasks.py),写所有相关的任务
- 一般每一个任务都存在独立的一个包中
-
本项目需要任务就是要发送短信(当前短信发送有网络延迟且是同步的,需要把它变成异步的),
-
在tasks.py中定义一个函数send_sms_code(),函数体内调用发送短信 CCP().send_message()方法
- CCP类定义在ronglianyun包内,可以直接导入引用,但celery可以独立于Django,所以建议将ronglianyun包在sms包内复制一套,直接导入sms中的ronglianyun包
- 相当常量,也在sms包里重新定义
- 短信发送有成功或失败,虽然异步无法处理,还是建议将发送结果做为函数返回值
-
方法定义完成后,还需要与任务建议关联,本次采用装饰器
扫描二维码关注公众号,回复: 13005604 查看本文章- @celery_app.task()
-
如果现在运行一下celery会出现下面内容
-
注意事项:
- 注意当前路径,应该为项目的根目录下,manage.py所在的目录
- 此时没有任务名称(因为任务还没注册)
5、注册任务
- 在celery_tasks.main.py中注册任务
- 只需要写到sms包即可,celery会自动找tasks.py文件,执行绑定的方法
# 注册任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])
6、启动Celery服务
6.1 linux 环境下启动celery :
celery -A celery_tasks.main worker -l info
6.1 windows 环境下启动celery :
celery -A celery_tasks.main worker -l info --pool=solo
或
celery -A celery_tasks.main worker -l info -P eventlet
# 需要安装evenlet :pip install eventlet==0.29.1
7、修改项目中短信发送方式
- 将原有发送方式改过生产者消费者模式发送
# apps/verifications/views.py
send_sms_code.delay(mobile, sms_code)
8、系统发送短信效果
- windowns下正常启动celery
- 发送短信