zoukankan      html  css  js  c++  java
  • django+celery+redis应用

    一、celery介绍

      1、应用场景

        a. Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,如果你的业务场景中需要用到异步任务,就可以考虑使用celery

        b. 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让你的程序等着结果返回,而是给你返回 一个任务ID,你过一段时间只需要拿着这个任务id就可以拿到任务执行结果, 在任务执行ing进行时,你可以继续做其它的事情

        c. Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis

      2、redis的优点

        a. 简单:一单熟悉了celery的工作流程后,配置和使用还是比较简单的

        b. 高可用:当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务

        c. 快速:一个单进程的celery每分钟可处理上百万个任务

        d. 灵活: 几乎celery的各个组件都可以被扩展及自定制

      3. celery的工作流程

        

         user:用户程序,用于告知celery去执行一个任务。
         broker: 存放任务(依赖RabbitMQ或Redis,进行存储)
         worker:执行任务

      4、celery的特性

          1)方便查看定时任务的执行情况, 如 是否成功, 当前状态, 执行任务花费的时间等.

          2)可选 多进程, Eventlet 和 Gevent 三种模型并发执行.

          3)Celery 是语言无关的.它提供了python 等常见语言的接口支持.

    二、celery组件

      1、celery扮演生产者和消费者的角色

          Celery Beat : 任务调度器. Beat 进程会读取配置文件的内容, 周期性的将配置中到期需要执行的任务发送给任务队列.

          Celery Worker : 执行任务的消费者, 通常会在多台服务器运行多个消费者, 提高运行效率.

          Broker : 消息代理, 队列本身. 也称为消息中间件. 接受任务生产者发送过来的任务消息, 存进队列再按序分发给任务消费方(通常是消息队列或者数据库).

          Producer : 任务生产者. 调用 Celery API , 函数或者装饰器, 而产生任务并交给任务队列处理的都是任务生产者.

          Result Backend : 任务处理完成之后保存状态信息和结果, 以供查询.

      2、celery架构图

          

       3、产生任务的方式

          1) 发布者发布任务(WEB 应用)

          2) 任务调度按期发布任务(定时任务)

      4、celery依赖的三个库:这三个库,都是由celery的开发者发开和维护

          billiard : 基于 Python2.7 的 multisuprocessing 而改进的库, 主要用来提高性能和稳定性.

          librabbitmp : C 语言实现的 Python 客户端

          kombu : Celery 自带的用来收发消息的库, 提供了符合 Python 语言习惯的, 使用 AMQP 协议的高级借口.

     三、celery的使用

      安装相关依赖包

    pip3 install Django==2.0.4
    pip3 install celery==4.3.0
    pip3 install redis==3.2.1
    pip3 install  django-celery==3.1.17
    pip3 install ipython==7.6.1 

      在与项目同名的目录下创建celery.py

    # -*- coding: utf-8 -*-
    from __future__ import absolute_import
    import os
    from celery import Celery
    
    # 只要是想在自己的脚本中访问Django的数据库等文件就必须配置Django的环境变量
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celery_test.settings')
    
    # app名字
    app = Celery('celery_test')
    
    # 配置celery
    class Config:
        BROKER_URL = 'redis://192.168.56.11:6379'
        CELERY_RESULT_BACKEND = 'redis://192.168.56.11:6379'
    
    app.config_from_object(Config)
    # 到各个APP里自动发现tasks.py文件
    app.autodiscover_tasks()
    celery.py

      在与项目同名的目录下的 init.py 文件中添加下面内容

    # -*- coding:utf8 -*-
    from __future__ import absolute_import, unicode_literals
    
    # 告诉Django在启动时别忘了检测我的celery文件
    from .celery import app as celery_ap
    __all__ = ['celery_app']
    __init__.py

      创建app01/tasks.py文件

    # -*- coding:utf8 -*-
    from __future__ import absolute_import, unicode_literals
    from celery import shared_task
    import time
    
    # 这里不再使用@app.task,而是用@shared_task,是指定可以在其他APP中也可以调用这个任务
    @shared_task
    def add(x,y):
        print('########## running add #####################')
        return x + y
    
    @shared_task
    def minus(x,y):
        time.sleep(30)
        print('########## running minus #####################')
        return x - y
    app01/tasks.py

      保证启动了redis-server

      启动一个celery的worker

    celery multi start w1 w2 -A celery_pro -l info     #一次性启动w1,w2两个worker
    celery -A celery_pro status                        #查看当前有哪些worker在运行
    celery multi stop w1 w2 -A celery_pro              #停止w1,w2两个worker
    
    celery  multi start celery_test -A celery_test -l debug --autoscale=50,5        # celery并发数:最多50个,最少5个
    ps auxww|grep "celery worker"|grep -v grep|awk '{print $2}'|xargs kill -9       # 关闭所有celery进程

      测试celery

    ./manage.py shell
    import tasks
    t1 = tasks.minus.delay(5,3)
    t2 = tasks.add.delay(3,4)
    t1.get()
    t2.get()

      

  • 相关阅读:
    ExecuteScalar requires the command to have a transaction when the connection assigned to the command is in a pending
    如何从vss中分离程序
    String or binary data would be truncated
    the pop3 service failed to retrieve authentication type and cannot continue
    The POP3 service failed to start because
    IIS Error he system cannot find the file specified _找不到页面
    pku2575Jolly Jumpers
    pku2940Wine Trading in Gergovia
    pku3219二项式系数
    pku1029false coin
  • 原文地址:https://www.cnblogs.com/ppzhang/p/12176299.html
Copyright © 2011-2022 走看看