首页 > 其他分享 >celery

celery

时间:2023-10-18 21:13:50浏览次数:35  
标签:异步 worker redis celery 任务 print

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还没启动:

      

    获取结果:

      

 

标签:异步,worker,redis,celery,任务,print
From: https://www.cnblogs.com/Lucky-Hua/p/17773179.html

相关文章

  • celery定时任务与周期任务
    celery定时任务与周期任务创建celery定时任务的方法与方式创建celery的定时任务有很多,我们这里只提到笔者使用过的首先你需要创建两个文件。第一个文件为celery配置一些东西。importos,djangoos.environ.setdefault("DJANGO_SETTINGS_MODULE","settings")django.setup(......
  • Django RestFramework、Celery及Channels
    DjangoRESTFramework什么是RESTfulAPIRESTfulAPI是一种基于HTTP协议的接口设计风格,它使用统一的接口和资源的概念来定义和操作网络应用程序的功能和数据。RESTfulAPI使用HTTP动词(GET、POST、PUT、DELETE等)来表示操作类型,并使用URL来标识资源。传统风格的HTTP接口常用授......
  • django集成celery
    参考:https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-first-steps这里只记录一些要注意的地方1、celery主文件importosfromceleryimportCelery#SetthedefaultDjangosettingsmoduleforthe'celery'program.#这个是导入djan......
  • Celery架构和主要模块
    **任务模块**包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往任务队列,而定时任务由CeleryBeat进程周期性地将任务发往任务队列。**消息中间件Broker**Broker,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列。Celery本身不提供......
  • Celery周期性任务定义beat
    通过celerybeat可以使用周期性任务的定义。https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html周期性任务beat相关设置:https://docs.celeryq.dev/en/stable/userguide/configuration.html#std-setting-beat_schedule您必须确保一次只运行一个beat调度程序,否......
  • django-celery-results - 使用 Django ORM/Cache 作为结果后端
    https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html#django-celery-results-using-the-django-orm-cache-as-a-result-backend这个一般自己设置一下result_backend也行,要用django-celery-results也是一个选择。......
  • django-celery-beat插件使用
    该插件从Django管理界面管理celery的定期任务,您可以在其中动态****创建、编辑和删除定期任务以及它们的运行频率。django-celery-beat提供了几种添加定时或周期性任务的方式,预先在在settings.py中添加好定时任务。通过Djangoadmin后台动态添加。(实际上就是操作model模型类)......
  • flower插件-监视celery
    安装和使用:https://flower.readthedocs.io/en/latest/install.html#installationhttps://github.com/mher/flower/tree/master/examplescelery相关配置:#发送与任务相关的事件,以便可以使用flower之类的工具来监控任务#或者在启动worker服务时,使用-E参数。worker_send_task_......
  • fastapi+tortoise-orm+redis+celery 多worker数据库连接
    我用fastapi在写接口,数据库orm用的是tortoise-orm,接口的数据库操作是正常的。现在加入了celery,但是每个celery在执行任务时,不能获取到数据库连接我想要每个worker获得数据库连接,但是不要每个任务都去连接一次,并在每个worker结束时,断开连接,但是不能断开其他worker的数据库连接from......
  • Django celery 定时任务与周期任务的创建-暂停-开始-删除
    发开阶段遇到了需要定时任务以及周期任务才能进行的事情,这里进行记录一下,防止下次我再写的时候写不明白。首先在你们项目里面创建以下文件:celery:importosos.environ.setdefault("DJANGO_SETTINGS_MODULE","settings")fromceleryimportCeleryfromquality_control.ce......