Django 集成 Celery 异步任务队列(Broker RabbitMQ版)

34 篇文章 3 订阅
7 篇文章 0 订阅

一、前言

在Django Web平台开发中,碰到一些请求执行的任务时间较长的情况,为了加快用户的响应时间,就可以采用Celery异步任务的方式来解决

好文章 记得收藏+点赞+关注额 !!!

---- Nick.Peng


二、关于 Celery

  • Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。
  • 如图Celery的架构,它采用典型的生产者-消费者模式,主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。
  • 实际应用中,用户从Web前端发起一个请求,我们只需要将请求所要处理的任务丢入任务队列broker中,由空闲的worker去处理任务即可,处理的结果会暂存在后台数据库backend中。我们可以在一台机器或多台机器上同时起多个worker进程来实现分布式地并行处理任务。
    在这里插入图片描述

三、Django 中集成 Celery

在实际使用过程中,发现Celery在Django里的实现与其在一般.py文件中的实现还是有很大差别,Django有其特定的使用Celery的方式。这里着重介绍Celery在Django中的实现方法,简单介绍与其在一般.py文件中实现方式的差别。

  • 建立消息队列
    在这里插入图片描述
    缺少监控就意味着这个监控已经失效,因此相关的 Flower、Celery events、celerymon 和其他基于此功能的监控工具全部失效。
    远程管理控制是指可以通过 celery inspect 和 celery control(以及使用远程控制API的工具)在程序运行时检查和管理职程(Worker)的能力

    所以这里我们采用RabbitMQ来实现消息中间件,输入以下命令安装:
    sudo apt-get install rabbitmq-server
    安装成功后,rabbitmq-server就已经安装好并运行在后台了。也可以使用service rabbitmq-server status查看运行状态

    另外也可以通过命令sudo rabbitmq-server -detached来在后台启动rabbitmq server。
    更多的命令可以参考rabbitmq官网的用户手册:https://www.rabbitmq.com/manpages.html

  • 安装django-celery

    pip install celery
    pip install django-celery
    
  • 配置settings.py
    首先,在Django工程的settings.py文件中加入如下配置代码:

    import djcelery
    
    djcelery.setup_loader()
    # 设置代理人broker
    BROKER_URL= 'amqp://guest@localhost//'
    # 设置结果存储位置
    CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
    

    说明:

    • 当djcelery.setup_loader()运行时,Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件,找到标记为task的方法,将它们注册为celery task。

    • BROKER_URL和CELERY_RESULT_BACKEND分别指代你的Broker的代理地址以及Backend(result store)数据存储地址。

    • 在Django中如果没有设置backend,会使用其默认的后台数据库用来存储数据。注意,此处backend的设置是通过关键字CELERY_RESULT_BACKEND来配置,与.py文件中实现celery的backend设置方式有所不同。

    • py文件中是直接通过设置backend关键字来配置,如下所示:

      app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
      

      然后,在INSTALLED_APPS中加入djcelery:

      INSTALLED_APPS = (
          ……   
          'qv',
          'djcelery'
          ……   
      )   
      
  • 在要使用该任务队列的app根目录下(比如qv),建立tasks.py,比如:
    在这里插入图片描述
    在tasks.py中我们就可以编码实现我们需要执行的任务逻辑,在开始处import task,然后在要执行的任务方法开头用上装饰器@task。
    需要注意的是,与一般的.py中实现celery不同,tasks.py必须建在各app的根目录下,且不能随意命名。

  • 生产任务
    在需要执行该任务的View中,通过build_job.delay的方式来创建任务,并送入消息队列。比如:
    在这里插入图片描述

  • 启动worker的命令

    #先启动服务器
    python manage.py runserver
    #再启动worker 
    python manage.py celery worker -c 4 --loglevel=info
    

四、利用 flower 监控管理 Celery 集群

Celery提供了一个工具flower,将各个任务的执行情况、各个worker的健康状态进行监控并以可视化的方式展现,如下图所示:
在这里插入图片描述
可视化监控实现的方式:

  • 安装flower:
    pip install flower
  • 启动flower(默认会启动一个webserver,端口为5555):
    python manage.py celery flowercelery flower -A project_name --port=5555
  • 进入http://localhost:5555即可查看。
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值