关于celery的定义,首先来看官方网站:Celery(芹菜) 是一个简单、灵活且可靠的,处理大量消息的分布式系统,而且提供维护这样一个系统的必需工具。html
简单来看,是一个基于python开发的分布式异步消息任务队列,持使用任务队列的方式在分布的机器、进程、线程上执行任务调度。经过它能够轻松的实现任务的异步处理, 若是你的业务场景中须要用到异步任务,就能够考虑使用celery, 举几个实例场景中可用的例子:python
Celery 在执行任务时须要经过一个中间人(消息中间件)来接收和发送任务消息,以及存储任务结果,完整的中间人列表请查阅官方网站redis
PS:任务队列是一种在线程或机器间分发任务的机制。架构
PS:消息队列的输入是工做的一个单元,称为任务,独立的工做(Worker)进程持续监视队列中是否有须要处理的新任务。 并发
Celery 系统可包含多个职程和中间人,以此得到高可用性和横向扩展能力,其基本架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。app
Celery的主要特色:异步
一、用户应用程序讲任务经过celery放入Broker中。分布式
二、多个worker经过Broker获取任务并执行。工具
三、worker执行完成后,会把任务的结果、状态等信息返回到Broker中存储,供用户程序读取。网站
PS:Celery 用消息通讯,一般使用中间人(Broker)在客户端和职程间斡旋。这个过程从客户端向队列添加消息开始,以后中间人把消息派送给职程。
# 利用pip3命令安装celery模块
pip3 install celery
from celery import Celery app = Celery('task', # 是当前模块的名称,这个参数是必须的,这样的话名称能够自动生成 broker="redis://192.168.100.83:6379/0", # 中间人的地址 backend="redis://192.168.100.83:6379/1" # 结果数据存放地址 ) @app.task # 使用celery标识一个任务,多个任务都须要使用该装饰器 def add(x,y): return x+y
其余中间件
1 # rabbitmq 2 broker = 'amqp://user:password@ip:5672//' 3 4 # redis 5 broker = 'redis://passwordf@ip:6379/db'
运行一个worker
elery -A task worker --loglevel=debug # -A参数表示的是Celery APP的名称,task就是APP的名称(应用文件名) # worker表示是一个执行任务角色 # loglevel=info记录日志类型默认是info
生产者
form ling import add re = add.delay(10, 20) print(re.result) #获取结果 print(re.ready) #是否处理 print(re.get(timeout=1)) #获取结果 print(re.status) #是否处理