RabbitMQ队列
rabbitMQ是消息队列;想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互)、进程queue(父进程与子进程进行交互或者同属于同一父进程下的多个子进程进行交互);如果两个独立的程序,那么之间是不能通过queue进行交互的,这时候我们就需要一个中间代理即rabbitMQ
消息队列:
- RabbitMQ
- ZeroMQ
- ActiveMQ
- ...........
原理:
1、安装和基本使用
安装RabbitMQ服务 http://www.rabbitmq.com/install-standalone-mac.html
python安装RabbitMQ模块
pip install pika or easy_install pika or 源码 https://pypi.python.org/pypi/pika
2、实现最简单的队列通信
发送端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel() #声明一个管道(管道内发消息)
channel.queue_declare(queue='lzl') #声明queue队列
channel.basic_publish(exchange='',
routing_key='lzl', #routing_key 就是queue名
body='Hello World!'
)
print("Sent 'Hello,World!'")
connection.close() #关闭
接收端:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='lzl')
def callback(ch,method,properties,body):
print(ch,method,properties)
#ch:<pika.adapters.blocking_connection.BlockingChannel object at 0x002E6C90> 管道内存对象地址
#methon:<Basic.Deliver(['consumer_tag=ctag1.03d155a851b146f19cee393ff1a7ae38', #具体信息
# 'delivery_tag=1', 'exchange=', 'redelivered=False', 'routing_key=lzl'])>
#properties:<BasicProperties>
print("Received %r"%body)
channel.basic_consume(callback, #如果收到消息,就调用callback函数处理消息
queue="lzl",
no_ack=True) #接受到消息后不返回ack,无论本地是否处理完消息都会在队列中消失
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming() #开始收消息
注:windows连linux上的rabbitMQ会出现报错,需要提供用户名密码
3、RabbitMQ消息分发轮询
先启动消息生产者,然后再分别启动3个消费者,通过生产者多发送几条消息,你会发现,这几条消息会被依次分配到各个消费者身上
在这种模式下,RabbitMQ会默认把p发的消息公平的依次分发给各个消费者(c),跟负载均衡差不多
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() #声明一个管道(管道内发消息) channel.queue_declare(queue='lzl') #声明queue队列 channel.basic_publish(exchange='', routing_key='lzl', #routing_key 就是queue名 body='Hello World!' ) print("Sent 'Hello,World!'") connection.close() #关闭