zoukankan      html  css  js  c++  java
  • Django --- celery异步任务与RabbitMQ模块

    一 RabbitMQ 和 celery


    1 celery

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

    celery 异步处理需要传递消息和存储结果,传递消息的叫 Broker(消息中间件),存储结果的叫 backend


    (1) celery使用场景:

    1 web应用。当用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给celery去异步执行,执行完成后再返回给用户。
    
    2 定时任务。生产环境经常会有一些定时任务。
    
    3 其他可以异步执行的任务。比如发送消息/ 邮件、推送消息、清理/设置缓存等
    

    (2) celery的broker:

    Celery 在执行任务时需要通过一个**消息中间件**来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redis;
    
    celery 消息的解决方案默认使用 amqp 协议(即 RabbitMQ),可以在配置中指定其他的消息解决方案
    

    (3) Celery 定时任务:

    Celery 定时任务-- celery beat(django也可以使用)
    
    启动celery beat 和worker,实现隔一段时间,beat会发起一个任务消息让worker执行任务
    

    2 RabbitMQ

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。

    MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。
    
    应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。
    
    消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
    
    排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
    

    RabbitMQ作为一个消息队列管理工具被引入到和Celery集成,负责处理服务器之间的通信任务

    RabbitMQ安装

    安装配置epel源
       $ rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
     
    安装erlang
       $ yum -y install erlang
     
    安装RabbitMQ
       $ yum -y install rabbitmq-server
    
    注意:service rabbitmq-server start/stop
    

    安装API

    pip install pika
    or
    easy_install pika
    or
    源码
     
    注意: celery 不是使用的pika,而是自己实现的,维护的“amqp”包
    https://pypi.python.org/pypi/pika
    

    基于内存队列的,queue 消息队列(生产者消费者模型)

    	import Queue
    	import threading
    	
    	
    	message = Queue.Queue(10)
    	
    	
    	def producer(i):
    	    while True:
    	        message.put(i)
    	
    	
    	def consumer(i):
    	    while True:
    	        msg = message.get()
    	
    	
    	for i in range(12):
    	    t = threading.Thread(target=producer, args=(i,))
    	    t.start()
    	
    	for i in range(10):
    	    t = threading.Thread(target=consumer, args=(i,))
    	    t.start()
    

    而 RabbitMQ, 生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMQ Server实现的消息队列。


    RabbitMQ的几个概念

    1 Queue(队列)是RabbitMQ的内部对象,用于存储消息。
    
    2 Channel是与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。
    
    3 exchange:生产者不是将消息直接放到queue(队列)中,而是先到exchange中,exchange主要用于控制消息到队列的路由,根据具体的exchange type将消息传给需要的队列或者直接废弃。
    
    	ExchangeType有fanout、direct、topic、headers这四种,不同的类型有着不同的路由策略
    

    二 django-celery 模块的使用


    1 提高网站请求速度的方法

    提高网站的请求速度,提高 用户 体验 
    
     1 缓存
    
     2 不能缓存的 任务可以提交 celery 异步执行
    

    2 原理:

    开一个新的进程(也可以加定时任务)
        处理耗时的操作
    
    
    任务---函数--task
    队列 queue 存储多个耗时操作
    worker 负责执行renwu
    broker 负责调度
    

    3 使用 :

    安装
    
    pip install celery
    pip install celery-with-redis
    pip install django-celery
    
    
    配置:
    
        install_apps = {
        '''
        'djcelery'
        }
    
        import djcelery
    
        djcelery.setup_loader()![](https://images2018.cnblogs.com/blog/1220788/201803/1220788-20180328215633011-1420381525.png)
    
        BROKER_URL = 'redis://127.0.0.1:6379/0'
        CELERY_IMPORTS = ('应用名称.task')
    
    在应用目录下创建 task.py文件
    
        import time
        from celery import task
    
        @task
        def sayhello():
    
            print('hello...')
            time.sleep(0.5)
            print('world...')
    
    
    迁移 生成celery的数据表
    
        python manage.py migrate
    
    启动 redis
    
    调用 worker
    
        python manage.py celery worker --loglevel=info
    
    调用函数
    
        function.delay()
    

  • 相关阅读:
    Vue 组件的基础介绍
    Java web中的路径问题
    个人网站的使用路线
    EL表达式
    jsp
    状态管理和作用域对象
    servlet
    jsp session获取问题
    关于jsp页面中接收二维数组
    个人网站开发(二)
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8482139.html
Copyright © 2011-2022 走看看