先来上一张celery框架图解:
Celery的架构由三部分组成,消息中间件(brokers),任务执行单元(worker),和任务执行结果存储(task result store)组成。
消息中间件
Celery本身不提供消息服务,但是可以方便和第三方提供的消息中间件集成,包括,RabbitMq,redis,MongoDB,Ironmq,Django orm,
执行任务单元
Woreker是celery提供的执行任务的单元,worker并发的运行在分布式系统的节点中。
任务结果存储
Task result store用来存储worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP.redis,memcached,mongodb,sqlalchemy,django orm,apache ,Ironcache
此处我们使用rabbitmq,
启动管理插件:sbin/rabbitmq-plugins enable rabbitmq_management
启动rabbitmq:sbin/rabbitmq-server-detached
安装celery :建议使用virtualenv
首先,定义一个task。
from celery import Celery
app=Celery('tasks',backend='amqp://guest@localhost//',broker='amqp://guest@localhost//')
@app.task
def add(x,y):
return x+y
保存为tasks.py
——>broker就是中间件了,backend就是后端来发送状态消息,保持追踪任务的状态,存储或发送这些状态。
现在另开一个虚拟环境,ipython
from tasks import add
result = add.delay(6,7)
现在你可以用之前的命令启动的终端看到结果。
使用Celery
Celery是一个实时处理和任务调度的分布式任务队列,所谓任务就是消息,消息中的有效载荷中包含要执行任务需要的全部数据。
使用celery的常见场景如下:
1.web应用。当用户出发一个操作需要较长时间才能执行完成,可以把它作为任务教给Celery去异步执行,执行完再返回给用户。这时候用户需要等待,这样就提高了网站的吞吐量和响应时间。
2.定时任务。生产环境经常会跑一些定时任务。假如你有上千台服务器、上千种任务,定时任务的管理很困难,Celery可以帮助我们再不同机器上设定不同种任务。
3.同步完成的附加操作可都可以异步完成。比如发送邮件、推送消息、清理/设置缓存等。