Celery基础介绍

一、Celery的基础介绍

1.celery简介

  • Celery 是一个异步任务队列/基于分布式消息传递的作业队列。其本质是生产者和消费者模式。生产者发送任务到消息队列,消费者负责处理任务。

2.celery 的架构

  • Celery的架构由三部分组成:消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)。
    • 消息中间件Broker:支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等,官方推荐RabbitMQ
    • 任务执行单元Worker:负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。
    • 结果存储Backend:支持RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch

3.celery 工作原理

  • 1.任务模块Task包含异步任务和定时任务。
    • 异步任务通常在业务逻辑中被触发并发往消息队列,
    • 定时任务由Celery Beat进程周期性地将任务发往消息队列
  • 2.任务执行单元Worker实时监视消息队列获取队列中的任务执行
  • 3.Woker执行完任务后将结果保存在Backend中

4.安装

由于celery是有python开发,所以可以使用pip包管理工具直接下载
pip install celery

5.使用

  • 不使用配置文件的简单使用

    • 在assets应用模块的__init__.py 创建celery实例
      Celery基础介绍_第1张图片
    • tests.py:任务定义文件
    import time
    from assets import app
    
    @app.task
    def add(x, y):
        time.sleep(5)     # 模拟耗时操作
        return x + y
    
    • 启动worker
      celery worker -A assets.tests -l debug
      • worker: 代表启动的角色是worker,当然还有beat等其它角色
      • A: 项目路径,这里我的项目引用路径是assets.tests
      • l: 启动的日志级别,这里我启用了debug级别
        查看日志输出,会发现我们定义的任务
    • 现在worker启动了,但是我们需要用delay或apply_async来将任务添加到worker中。这里我们使用交互方式来添加任务,并返回AsyncResult对象,通过AsyncResult对象获取结果.
      Celery基础介绍_第2张图片
      • a = add.delay(args),发送任务到队列中
      • ready(): 判断任务是否有结果,返回True or False
      • state:返回任务状态
      • task_id: 返回任务id
      • result: 返回任务结果,同get()方法
      • info: 获取任务信息,默认返回结果
      • successful(): 判断任务是否成功,返回True or False
  • 使用配置文件

    • 这里我把配置文件写在const.py文件,可自行决定写什么文件名(一般config比较见名知意)
      BROKER_URL = 'redis://127.0.0.1:6379/10' # Broker配置,使用Redis作为消息中间件
      
      CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/11' # BACKEND配置,这里使用redis
      
      CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案
      
      CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间
      
      CELERY_TIMEZONE='Asia/Shanghai'   # 时区配置
      
      CELERY_IMPORTS = (     # 指定导入的任务模块,可以指定多个
          'assets.tests',
      )
    
    • 加载配置模块
      Celery基础介绍_第3张图片

    • tests.py:定义任务

    import time
    from assets import app
    
    @app.task
    def add(x, y):
        time.sleep(5)     # 模拟耗时操作
        return x + y
    
    • 启动worker, 这里这次试用日志级别为info, 可以看到我们的定义的add任务
      celery worker -A assets.tests -l info
      Celery基础介绍_第4张图片

总结:

  • celery 消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)组成

  • 业务逻辑触发发送任务给消息队列,任务执行单元worker实时监听获取消息队列中的任务执行,worker执行任务后将结果保存在Backen中

  • 应用场景:

    • web应用:当用户在网站进行某个操作需要很长时间完成时,我们可以将这种操作交给Celery执行,比如发送邮件
    • 任务场景:比如在运维场景下需要批量在几百台机器执行某些命令或者任务
    • 定时任务:向定时导数据报表、定时发送通知类似场景
  • 定时任务的使用 下个章节分析

你可能感兴趣的:(python,django,celery,celery定时任务,celery异步任务,celery详解,django之celery使用)