一 RabbitMQ 和 celery
1 celery
Celery 是一个 基于python开发的分布式异步消息任务队列,经过它能够轻松的实现任务的异步处理, 若是你的业务场景中须要用到异步任务,就能够考虑使用celerypython
celery 异步处理须要传递消息和存储结果,传递消息的叫 Broker(消息中间件),存储结果的叫 backendweb
(1) celery使用场景:redis
1 web应用。当用户触发的一个操做须要较长时间才能执行完成时,能够把它做为任务交给celery去异步执行,执行完成后再返回给用户。 2 定时任务。生产环境常常会有一些定时任务。 3 其余能够异步执行的任务。好比发送消息/ 邮件、推送消息、清理/设置缓存等
(2) celery的broker:django
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集成,负责处理服务器之间的通讯任务app
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() 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()