celery分布式任务调度框架_基础

632 阅读2分钟

概念解释

  1. celery:用户编写的代码脚本,用来定义要执行的任务
  2. broker:代理,通过消息队列在客户端和worker之间进行协调
  3. 消息队列:celery本身不包含消息队列,支持的消息队列有rabbitmq、redisamazon sqs、zookeeper
  4. backend:数据库,用来存储任务返回的结果
  5. woker:用来执行brocker分派的任务
  6. 任务:需要执行的任务

流程

用户在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文件:

  1. 首先我们需要编写一个celery应用,用来创建任务和管理workers,它要能够被其他的模块导入.
  2. 想要跟踪任务的状态以及保存任务的返回结果,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服务的日志中看到接口任务和执行任务的日志
效果: 图片.png

from tasks import add
result = add.delay(4,4)
result = add.delay(4,4)
# ready返回任务是否执行完成
result.ready()
False

# 还可以等待结果完成,但很少使用这种方法,因为它将异步调用转换为同步调用
result.get(timeout=1)