celery

发布时间 2023-10-18 21:03:18作者: Maverick-Lucky

1. celery介绍

 1. celery是什么?

   分布式异步任务框架:第三方框架。

   项目中使用异步任务的场景,可以使用它

   之前做异步,如何做? 

    异步发送短信 ----》 开启多线程 ----》 不便于管理

 2.celery 有什么作用?

  - 执行异步任务

  - 执行延迟任务

  - 执行定时任务

 3. celery原理

  - 1. 可以不依赖任何服务器,通过自身命令,启动服务

  -2. celery服务为其他项目提供异步解决任务需求的

  注:会有两个服务同时运行,一个是项目服务,一个是celery服务,项目服务将需要异步处理的任务交给celery服务,celery就会在需要时异步完成项目的需求

比如:

  人是一个独立运行的服务 |  医院也是一个独立运行的服务

    正常情况下,人可以完成所有的健康情况的动作,不需要医院的参与;但当人生病的时候,就会被医院接收,解决人生病问题。

    人生病的处理方案交给医院来解决,所有人不生病时,医院独立运行,人生病时,医院就来解决人生病的需求

django如果不用异步,正常运行即可,如果想做异步,就借助于celery来完成

 4. celery架构

  - broker:消息中间件,任务中间件(消息队列:redis,rabbitmq)

    django要做异步,提交任务到 任务中间件中(redis) ,存储起来

    celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成,包括,RabbitMQ,Redis等等

  - worker:任务执行者,任务执行单元

    不停的从任务中间件中取任务,执行

    worker 是celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中

  - banckend:结果存储,任务结果存储

    把任务执行结果(函数返回值),存放到结果存储中(redis)

    用来存储worker执行的任务的结果,celery 支持以不同的方式存储任务的结果,包括AMQP,redis等

    

 

2. celery的快速使用

1. celery是开源的,小组织,不支持win,win上使用:需要借助于第三方

2. 安装:pip install celery

  - 安装的是最新版本:5.3.4

    

 3. 写代码 main.py

  1. 先导入celery,然后实例化得到对象

  2. 编写任务,使用app.task装饰---》变成celery的任务

import time

from celery import Celery

# 1. 实例化得到对象
broker = 'redis://127.0.0.1:6379/1' # 消息中间件 :redis,1:表示redis的第一个库
backend = 'redis://127.0.0.1:6379/1' # 结果存储,用redis
app=Celery('app',broker=broker,backend=backend)

# 2. 编写任务,必须用app.task装饰,才变成了celery的任务
@app.task
def send_sms():
    time.sleep(1)
    print('短信发送成功')
    return '手机号短信发送成功'

  # 3. 提交任务,使用别的线程

# 提交任务,使用别的进程
from main import send_sms

# 1.同步执行
# res = send_sms()
# print(res)

# 2. 异步发送短信
# 返回结果不是send_sms的返回值,是一个任务id号
# 这个任务还没有被执行,只是提交到任务中间件中了(redis)
res = send_sms.delay()
print(res) # 346b7b90-31b1-4daa-8792-3112ea028df7

# 任务要执行,要启动worker --》 使用命令启动 ---》启动celery服务
# 在win上:要先安装: pip install eventlet

  结果:redis的db1中,任务提交成功

    

  4. 启动worker,可以在3之前

    Windows:

      - 1. 先安装:pip install eventlet

        

      - 2. 执行命令,启动celery服务:

      celery  -A main worker -l info -P eventlet (路径要对,先切换到main.py所在路径下)

         

# 任务要执行,要启动worker --》 使用命令启动 ---》启动celery服务
# 执行命令:celery -A tasks worker --loglevel=INFO
# 在win上:要先安装: pip install eventlet
# celery -A main worker -l info -P eventlet  # 启动worker
# mac,Linux:
# celery -A main worker -l info

  结果:

  

  #  5 worker就会执行任务,把执行的结果,放到结果存储中

  # 6. 获取结果

from celery.result import AsyncResult
from main import app

id = '346b7b90-31b1-4daa-8792-3112ea028df7'
if __name__ == '__main__':
    a = AsyncResult(id=id, app=app)
    if a.successful():
        result = a.get()
        print(result)
    elif a.failed():
        print('任务失败')
    elif a.status == 'PENDING':
        print('任务等待中被执行')
    elif a.status == 'RETRY':
        print('任务异常后正在重试')
    elif a.status == 'STARTED':
        print('任务已经开始被执行')

 

     worker执行完任务之后:

      

     当再次提交一个任务且 worker还没启动:

      

    获取结果: