概念
Celery:是一个分布式队列的管理工具。
提供了简便的接口管理任务队列
结构
生产者 user: 发布任务
任务队列 broker: 存储任务,常见的有redis,rabbitMQ
职程(工作者) worker: 处理任务
结果 backend 存储结果
使用
-
首先需要一个redis服务器用来做消息队列和存储任务的结果,这个redis可以在本地,也可以在远程,他可能是一个redis服务,也可能是redis集群。
sudo apt-get install redis
vim /etc/redis/redis.conf
将保护模式关闭(protected mode: no), 注释掉(bind)。
cd /usr/bin/
./redis-server /etc/redis/redis.conf
-
需要一个被发布的任务
pip install celery
安装celery,注意版本可能与环境不切合,或者版本就是异常的,pip install --upgrade https://github.com/celery/celery/tarball/master,不是自己代码问题就把版本调低
pip install django-redis
redis支持
from celery import Celery
import time
app = Celery('tasks',broker='redis://ip:6379/0',backend='redis://ip:6379/1')
@app.task
def add(x,y):
time.sleep(10)
return x+y
- 需要一个任务的触发器,调用这个任务
# tasks.py
from somewhere import add
ret = add.delay(1,2)
# ret 就是一个id,可以凭借这个id去获取状态,如果是successful就可以获取结果信息。
- 启动Celery
folder是文件夹的名字,tasks.py是文件夹下的触发器。
celery worker -A folder.tasks -l info
取异步请求的结果
# result.py 等执行完上个程序在执行这个
from celery.result import AsyncResult
from folder.tasks import app # 创建的Celery实例拿过来
# 上面的程序得到的ret是AsyncResult对象,调用.id方式得到他的id。
ret = AsyncResult(id =ret.id,app=app)
print(ret.state)
if ret.successful():
print(ret