目录
1.为什么使用Celery?
- 消费者取到消息之后,要消费掉(执行任务),需要我们去实现。
- 任务可能出现高并发的情况,需要补充多任务的方式执行。
- 耗时任务很多种,每种耗时任务编写的生产者和消费者代码有重复。
- 取到的消息什么时候执行,以什么样的方式执行。
结论:
- 实际开发中,我们可以借助成熟的工具
Celery
来完成。- 有了
Celery
,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了程序员的开发流程。
2. Celery介绍
-
Celery介绍:
- 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
- 单个 Celery 进程每分钟可处理数以百万计的任务。
- 通过消息进行通信,使用
消息队列(broker)
在客户端
和消费者
之间进行协调。
-
安装Celery:
$ pip install -U Celery
3. 创建Celery实例并加载配置
1.定义Celery包(在主业务逻辑包的同级目录下,新建名字为celery_tasks的包)
2.创建Celery实例(在新建的包下面新建py文件main.py)
main.py里面编写创建实例的代码
# celery启动文件 from celery import Celery # 创建celery实例 celery_app = Celery('实例名称')
3.加载Celery配置(新建一个config.py的文件,来编写配置)
config.py里面添加配置的代码
# Celery的配置文件 # 指定中间人、消息队列、任务队列、容器,使用redis broker_url = "redis://192.168.174.129/10"
加载celery的配置(除了实例名称,其他都是固定写法)
# celery启动文件 from celery import Celery # 创建celery实例 celery_app = Celery('实例名称') # 加载celery配置 celery_app.config_from_object('celery_tasks.config')
4. 定义发送短信任务
创建发送短信的任务,(例如创建一个sms的包,任务名为tasks.py(固定的))
4.1.注册任务:在main.py下面编写代码
# celery启动文件 from celery import Celery # 创建celery实例 celery_app = Celery('meiduo') # 加载celery配置 celery_app.config_from_object('celery_tasks.config') # 自动注册celery任务 celery_app.autodiscover_tasks(['celery_tasks.sms'])
4.2.定义任务:在tasks.py 里面编写定义任务的代码
注:装饰器中的name可以自己定义,最好和本任务有关系.(一般和函数名相对应)
将需要使用的celery的代码,放到编写的函数里面,如果该原来该代码有参数,则还是原样给定义的函数加上参数
from celery_tasks.main import celery_app # bind:保证task对象会作为第一个参数自动传入 # name:异步任务别名 # retry_backoff:异常自动重试的时间间隔 第n次(retry_backoff×2^(n-1))s # max_retries:异常自动重试次数的上限 @celery_app.task(bind=True, name='ccp_send_sms_code', retry_backoff=3) # 使用装饰器装饰异步任务,保证celery识别任务 @celery_app.task(name='send_sms_code') # name就是给任务起个别名 def send_sms_code(mobile, sms_code): """ 发送短信验证码 :param mobile: 手机号 :param sms_code: 短信验证码 :return: 成功:0 失败:-1 """ send_ret = CCP().send_template_sms("*******", "*****", mobile, sms_code) return send_ret
5.启动Celery服务
进入到最初创建的celery_tasks的包的路径下,输入命令启动Celery服务
celery -A celery_tasks.main worker -l info
-A
指对应的应用程序, 其参数是项目中 Celery实例的位置。worker
指这里要启动的worker。-l
指日志等级,比如info
等级。
运行后可以到,[tasks] 的下面就由我们刚才定义的任务 send_sms_code
6. 调用发送短信任务
使用celery异步发送短信验证码代替原来的代码,导入定义的任务调用delay()函数
from celery_tasks.sms.tasks import send_sms_code # 使用Celery发送验证码 send_sms_code.delay(mobile, sms_code) # 固定的写法,调用delay