一、准备环境
我这里 rabbitmq 和 redis 都是使用docker搭建的。
1、下载docker镜像
rabbitmq,management 版本是带有web管理界面的
docker image pull rabbitmq:3.7.7-management
redis,
docker image pull redis
2、把docker容器跑起来
docker container run -itd --name rabbitmq -p 5672:5672 -p 15672:15672 --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 2888deb59dfc
参数解释:
-p ,5672是rabbitmq的端口,15672是web界面的端口
--hostname,主机名,RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名
RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码
docker container run -itd --name redis -p 6379:6379 f7302e4ab3a8 --requirepass "f7302e4ab3a8"
这样,rabbitmq 和 redis 就跑起来了。
3、安装celery相关环境
创建python2虚拟环境,并启动
virtualenv env
source ./bin/activate
4、使用pip安装 redis、celery、rabbitmq包
pip install redis
pip install celery[redis,msgpack,gevent]
二、写一个最小的demo
创建一个目录,test_celery,下面所有文件都放置在这个目录下。
1、tasks.py
#coding=utf-8
from celery import Celery
app = Celery('celery_task_demo',broker='amqp://admin:admin@127.0.0.1:5672/my_vhost',backend='redis://:f7302e4ab3a8@127.0.0.1:6379/0')
@app.task
def myadd(x,y):
return x+y
2、app.py
#coding=utf-8
from tasks import myadd
if __name__ == "__main__":
for i in range(0,16):
result = myadd.delay(1,i)
3、运行app.py,将任务放在 rabbitmq 队列中,
python app.py
运行完成后,打开 rabbitmq 的界面,在 queue 选项卡中,可以看到我们往队列里放置了16个任务,如下:
4、运行worker,worker从 任务队列中取任务,运行任务并将结果存储在redis中。
下面命令中的 tasks 是指 tasks.py,
celery worker -A tasks -l info
查看redis数据,发现db0中存在16条结果。
再次查看 rabbitmq 的任务队列,发现 16 个任务已经被消费完了,如下: