Python RabbitMQ消息队列

python内的队列queue
  •   线程 queue:不同线程交互,不能夸进程
  •   进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互
 注:不同的两个独立进程是不能交互的。
 
 
 
RabbitMQ消息队列
  •   RabbitMQ是用erlang语言开发的。windos环境需要先安装erlang。
  •   BabbitMQ主要以中间件的形式,实现多个独立进程的代理,维护网络通信。
  •   此原理实现的软件有RabbitMQ,ZeroMQ,ActiveMQ。

 

 

安装RabbitMQ

 

  • windos 安装完需要通过 管理-->服务-->RabbitMQ 开启服务
  • Linux 安装完 输入命令:rabbitmq-server start 开启服务

 

windos 下RabbitMQ\sbin\rabbitmq-server:启动服务

windos 下RabbitMQ\sbin\rabbitmqctl.bat:RabbitMQ管理工具

 

 

执行RabbitMQ管理工具
  • RabbitMQ:启动插件、重启生效
C:\Users\Administrator>"C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.2\s
bin\rabbitmq-plugins.bat" enable rabbitmq_management
 
  • RabbitMQ:基本命令 
rabbitmq的安装、启动和停止
rabbitmq-service.bat install 
rabbitmq-service.bat start 
rabbitmq-service.bat stop 
 
 
列出所有queue
rabbitmqctl.bat list_queues
 
 
列出指定queue的信息
rabbitmqctl.bat list_queues [the queue name] messages_ready messages_unacknowledged
 
 
列出所有exchange
rabbitmqctl.bat list_exchanges
 
 
列出所有binding
rabbitmqctl.bat list_bindings
 
 
安装基于web的管理插件
rabbitmq-plugins.bat enable rabbitmq_management 
 
 
查看所有队列信息
添加用户:
rabbitmqctl.bat add_user rainbird password
 
 
添加权限:
rabbitmqctl.bat set_permissions -p "/" rainbird ".*" ".*" ".*"
 
 
删除测试用户:
rabbitmqctl.bat delete_user guest

 

 
python 内安装pika模块
  • 安装 http://www.rabbitmq.com/install-standalone-mac.html
  • 安装python rabbitMQ module 
  • pip install pika or easy_install pika or 源码 https://pypi.python.org/pypi/pika

注:celery模块是分布式任务队列

 
RabbitMQ队列
 

 

send端

#!/usr/bin/env python
import pika

# 通过实例创建socket
connection = pika.BlockingConnection(
        pika.ConnectionParameters('localhost')
        )

# 声明一个管道/在管道内发消息
channel = connection.channel()

# 管道内,声明一个队列,queue=queue的名字
channel.queue_declare(queue='hello')

# routing_key = queue的名字
# bod = 消息内容
# 一个消息不能直接发送到队列,它总是需要经过一个exchange。
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

# 关闭队列
connection.close()

 

recv端

 

#_*_coding:utf-8_*_
__author__ = 'Alex Li'
import pika

# 实例话创建socket
connection = pika.BlockingConnection(
        pika.ConnectionParameters('localhost'))

# 声明一个管道/在管道内发消息
channel = connection.channel()


# 为什么再次声明queue名字:如果消费者先运行了,没有声明queue就会报错
# 如果想要防止报错发生,就要定义queue。
#
# 管道内,声明一个队列,queue=queue的名字
channel.queue_declare(queue='hello')

# 回调函数
# ch 管道内存对象地址
# method 消息发给哪个queue
# properties定义消息持久话对象
# body数据对象
def callback(ch, method, properties, body):
    print("-->",ch,method,properties)
    print(" [x] Received %r" % body)

# 消费消息
# callback 如果收到消息,就调用callback函数来处理消息
# queue 管道内的队列名字
# no_ack = True 这条消息出没处理完都不会给服务端发确认
channel.basic_consume(
                    callback,
                    queue='hello',
                    no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')

# 启动后一直运行,没有数据会等待..
channel.start_consuming()
posted @ 2018-01-15 18:33  kevin.Xiang  阅读(...)  评论(...编辑  收藏