概念解释
- celery:用户编写的代码脚本,用来定义要执行的任务
- broker:代理,通过消息队列在客户端和worker之间进行协调
- 消息队列:celery本身不包含消息队列,支持的消息队列有rabbitmq、redisamazon sqs、zookeeper
- backend:数据库,用来存储任务返回的结果
- woker:用来执行brocker分派的任务
- 任务:需要执行的任务
流程
用户在celery编写的代码脚本,用来定义要执行的任务worker,broker再将消息发送给worker服务来执行,
具体使用
1.安装
pip install -U Celery
2.docker安装redis
docker run -d -p 9000:6379 -v /root/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis:alpine redis-server /usr/local/etc/redis/redis.conf
run 启动容器 参数+镜像+容器
-d 后台运行
-p 端口映射 连接的时候用9000
-v 映射目录
redis连接url:redis://:password@hostname:port/db_number
3.python编写一个celery应用
创建一个task.py文件:
- 首先我们需要编写一个celery应用,用来创建任务和管理workers,它要能够被其他的模块导入.
- 想要跟踪任务的状态以及保存任务的返回结果,celery需要把它发送到某个地方。celery提供多种结果后端。这里以redis为例,添加一个redis后端
from celery import Celery
# 实例化celery应用
#app = Celery('task',brocker="redis://:密码@ip:9000/15")
app = Celery('task',
broker="redis://ip:9000/15",
backend='redis://ip:9000/14') # 设置数据库,保存对应的结果
# 定义任务
@app.task
def add(x,y):
return x+y
4.运行celery的worker服务
windows调试的前置准备:
1.安装event let库
pip install eventlet
2.运行worker是加上-P参数
# 在python命令行:cd到task.py所在的目录,然后运行下面的命令来启动worker服务
$ celery -A tasks worker --loglevel=INFO
5.调度任务
再创建一个add.py文件:
通过调用delay来执行对应的任务,celery会把执行命令发送到broker,broker再将消息发送给worker服务来执行,如果一切正常,你将在worker服务的日志中看到接口任务和执行任务的日志
效果:
from tasks import add
result = add.delay(4,4)
result = add.delay(4,4)
# ready返回任务是否执行完成
result.ready()
False
# 还可以等待结果完成,但很少使用这种方法,因为它将异步调用转换为同步调用
result.get(timeout=1)