Python RabbitMQ消息队列
python内的队列queue
- 线程 queue:不同线程交互,不能夸进程
- 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互
注:不同的两个独立进程是不能交互的。
RabbitMQ消息队列
- RabbitMQ是用erlang语言开发的。windos环境需要先安装erlang。
- BabbitMQ主要以中间件的形式,实现多个独立进程的代理,维护网络通信。
- 此原理实现的软件有RabbitMQ,ZeroMQ,ActiveMQ。
安装RabbitMQ
- RabbitMQ下载地址:http://www.rabbitmq.com/download.html
- erlang下载地址:http://www.erlang.org/downloads
- 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()