celery
Celery介绍
celery 是一个简单、灵活且可靠、处理大量消息的分布式任务队列,可以在一台或者多台机器上运行.本质是生产者消费者模型,生产者发送任务到消息队列,消息者负责处理任务。单个celery进程每分钟可以处理数以百万计的任务。通过消息进行通信,使用消息队列在生产者和消费者之间进行协调。
应用场景
- 当前执行任务,执行时间非常长,不需要实时返回结果。
- 定时任务
原理图
使用方法
安装
# 安装到虚拟环境中
pip install Celery
# 安装redis作为中间人
pip install redis
# 配置redis库 Django中是在setting中 broker_url='redis://127.0.0.1:6379/3'
# 如果使用rabbitmq作为中间人, broker_url= 'amqp://用户名:密码@ip地址:5672'
注册任务
-
我们需要建一个包celery_tasks,其中再建一个包,名字随意 例如:这里用sms
-
创建好后需要在里面添加一个tasks.py文件,注意,这里的tasks名字是规定死的。
-
需要在celery_tasks下创建一个main.py,并且报备注册上面一步创建的文件。
-
在celery_tasks包中再添加一个config.py文件。里面配置消息队列(中间人)的信息。
broker_url='redis://127.0.0.1:6379/3'
from celery import Celery
# 创建对象
celery_app = Celery('test')
# 将上面config配置给celery
# 里面的参数为我们创建的config配置文件
celery_app.config_from_object('celery_tasks.config')
# 让celery_app自动捕获目标地址下的任务,就是捕获tasks
celery_app.autodiscover_tasks(['celery_tasks.sms'])
实现任务
- 报备后需要在tasks.py中添加具体内容
例如:
from celery_tasks.main import celery_app
@celery_app.task(name='ccp_send_sms_code')
def ccp_send_sms_code(mobile, sms_code):
'''该函数就是一个任务, 用于发送短信'''
result = CCP().send_template_sms(mobile,[sms_code, 5], 1)
return result
启动消费者(celery消费者)
# 启动celery服务
celery -A celery_task.main worker -l info
# celery: celery是调用celery命令
# -A:作用是指定要启动的文件,这个参数后面的文件会被执行
# worker:启动的对象是worker,工人,干活的
# -l:指定日志打印等级,一般日志都是通知形式的,即info
补充celery worker的工作模式
-
默认是进程池方式
进程数以当前机器的CPU核数为参考,每个CPU开四个进程
-
如何自己指定进程数
celery worker -A proj --concurrency=4
-
如何改变进程池方式为协程方式
celery worker -A proj --concurrency=1000 -P enventlet -c 1000 # 例如 pip install eventlet celery -A celery_tasks.main worker -l info -P eventlet -c 1000