python-RabbitMQ基础篇
一、RabbitMQ简单介绍
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
RabbitMQ安装:
官网地址:http://www.rabbitmq.com/install-debian.html
方法一:
echo 'deb http://www.rabbitmq.com/debian/ testing main' |
sudo tee /etc/apt/sources.list.d/rabbitmq.list
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc |
sudo apt-key add -
#Run the following command to update the package list:
#更新程序包
sudo apt-get update
Install rabbitmq-server package:
sudo apt-get install rabbitmq-server
启动RabbitMQ服务:
#/etc/init.d/rabbitmq-server aaarticlea/png;base64,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" alt="" />
linux安装:
安装配置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
安装过程注意问题:
安装erlang
$ yum -y install erlang
系统报错:Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
解决方法:
打开/etc/yum.repos.d/epel.repo
找到:
1.[epel]
2.name=Extra Packages for Enterprise Linux 6 - $basearch3.#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch4.mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
修改为;
1.[epel]
2.name=Extra Packages for Enterprise Linux 6 - $basearch3.baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch4.#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
参考地址:http://xiedexu.cn/error-cannot-retrieve-metalink-repository-epel-please-verify-path-try.htm
安装API:
pip install pika
or
easy_install pika
or
源码 https://pypi.python.org/pypi/pika
使用API操作RabbitMQ
基于Queue实现生产者消费者模型
import queue,time
import threading
#先进先出
q = queue.Queue(20)
#生产者
def productor(arg):
"""
买票
:param arg:
:return:
"""
q.put(str(arg)+"-买票")
for i in range(30):
t = threading.Thread(target=productor,args=(i,)) #创建买票线程生产者,并将动态参数i传递给productor(arg)
t.start() #执行买票线程
# if i == 30:
# break
#消费者
def consumer(arg):
"""
服务器后台,
:param arg:
:return:
"""
while True:
print(arg,q.get()) #获取队列中存在元素
time.sleep(1)
sk = threading.BoundedSemaphore(5)
for j in range(5):
t = threading.Thread(target=consumer,args=(j,))#创建买票线程生产者,并将动态参数j传递给consumer(arg)
t.start() #执行c线程
1、RabbitMQ简单操作
对于RabbitMQ来说,生产和消费不再针对内存里的一个Queue对象,而是某台服务器上的RabbitMQ Server实现的消息队列。
在服务器端启动RabbitMQ程序:
aaarticlea/png;base64,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" alt="" />
生产者:
import pika # ######################### 生产者 #########################
print('--------------------生产者------------------------')
#链接rabbit服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.103'))
channel = connection.channel() #创建频道 channel.queue_declare(queue='nihao001')#创建队列名为xiaoluo001
#向xiaoluo001队列插入数字,routing_key=‘xiaoluo001’为队列名,body后则是插入的数据
channel.basic_publish(exchange='',
routing_key='nihao001',
body='Hello World!123456790')
print(" [x] Sent 'Hello World!'")
#缓冲区已经flush且消息已经 确认发送到rabbitMq,最后关闭连接
connection.close()
消费者:
import pika
# ########################## 消费者 ##########################
print("---------------消费者----------------------")
#链接rabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.103'))
#创建链接频道
channel = connection.channel()
#创建队列名为:xiaoluo001
channel.queue_declare(queue='xiaoluo001')
#callback函数:接收服务器端发送消息,他会被pika调用
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
#从队列中取数据,callback回调函数,如果拿到数据则执行callback函数
channel.basic_consume(callback,
queue='xiaoluo001',
no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
#循环等待数据处理和callback函数处理的数据
channel.start_consuming()
2、acknowledgment消息不丢失
no-ack = False,如果消费者遇到情况(its channel is closed, connection is closed, or TCP connection is lost)挂掉了,那么,RabbitMQ会重新将该任务添加到队列中。
%r用rper()方法处理对象
%s用str()方法处理对象
1、生产者不需要不需要变化
import pika
# ######################### 生产者 #########################
print('--------------------生产者------------------------')
#链接rabbit服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.152'))
channel = connection.channel() #创建频道 channel.queue_declare(queue='nihao001')#创建队列名为xiaoluo001
#向xiaoluo001队列插入数字,routing_key=‘xiaoluo001’为队列名,body后则是插入的数据
channel.basic_publish(exchange='',
routing_key='nihao001',
body='Hello World!123456790')
print(" [x] Sent 'Hello World!'")
#缓冲区已经flush且消息已经 确认发送到rabbitMq,最后关闭连接
connection.close()
2、消费者
import pika #导入pika模块
import time
#创建并连接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters(
host="192.168.1.152"))
#创建频道
channel = connection.channel()
#如果生产者没队列,那么消费者创建队列
channel.queue_declare(queue='lcj006')
def callback(ch,method,properties,body):
print('[xx] Receivd %r' % body) #%r:%r用rper()方法处理对象
import time
time.sleep(3)
print("ok")
ch.basic_ack(delivery_tag = method.delivery_tag) #此代码主要表示:ch想消息对列传送数据,表示数据已经传送成功,不需再传数据 channel.basic_consume(callback,
queue='lcj006',
no_ack=False) #no_ack=False:服务器挂机,rabbitmq会将此消息放至消息队列中
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming() #取队列中取数据
#当生产者生成一条数据,别消费者接受,消费者中断后如果不超过10秒,连接池队列中的数据依然存在,
# ,否则超过10秒,消费者重新链接服务器,数据丢失,从而消费者等待
3、durable 消息不丢失(持久化)
durable作用:当rabbitmq挂机了,durable将队列中数据持久化,前提需告知生产者发送的数据是需要durable持久化,那么代码中就需要用到delivery_mode=2对数据进行标记
生产者:
import pika
#链接rabbit服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.152'))
#创建频道
channel = connection.channel()
#创建队列名为hello,使用持久化durable=True
# make message persistent
channel.queue_declare(queue='hello001', durable=True) #
#向hello队列插入数字,routing_key=‘Hello World!’,body后则是插入的数据
channel.basic_publish(exchange='', #这个exchange参数就是这个exchange的名字. 空字符串标识默认的或者匿名的exchange:如果存在routing_key, 消息路由到routing_key指定的队列中。
routing_key='hello001',
body='Hello World!',
properties=pika.BasicProperties(
delivery_mode=2, # make message persistent
# 给服务器标记此条消息需要持久化,通过delivery_mode=2设置,
#不管mq是否挂机,此条消息都会存在服务器的消息对列中
))
print(" [x] Sent '开始队列!'")
connection.close()
消费者:
#!/usr/bin/env python
#*- coding:utf-8 -*-
import pika
print("----------------------消费者--------------------")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.152'))
channel = connection.channel()
#创建队列名为hello,使用持久化durable=True
# make message persistent
channel.queue_declare(queue='hello001', durable=True)
#此代码主要表示:ch向消息对列传送数据,表示数据已经传送成功,不需再传数据
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
import time
time.sleep(10)
print( 'ok')
ch.basic_ack(delivery_tag = method.delivery_tag) channel.basic_consume(callback,
queue='hello001',
no_ack=False)
print(' [*] 等待队列. To exit press CTRL+C')
channel.start_consuming()
注意:标记消息为持久化的并不能完全保证消息不会丢失,尽管告诉RabbitMQ保存消息到磁盘,当RabbitMQ接收到消息还没有保存的时候仍然有一个短暂的时间窗口. RabbitMQ不会对每个消息都执行同步fsync(2) --- 可能只是保存到缓存cache还没有写入到磁盘中,这个持久化保证不是很强,但这比我们简单的任务queue要好很多,如果你想很强的保证你可以使用 publisher confirms
4、消息获取顺序
默认消息队列里的数据是按照顺序被消费者拿走,例如:消费者1 去队列中获取 奇数 序列的任务,消费者1去队列中获取 偶数 序列的任务。
channel.basic_qos(prefetch_count=1) 表示谁来谁取,不再按照奇偶数排列
生产者:
import pika
import sys
#链接rabbit服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.152'))
#创建频道
channel = connection.channel()
#创建队列名为hello,使用持久化durable=True
# make message persistent
channel.queue_declare(queue='hello0001', durable=True) #
message=''.join(sys.argv[1:])or "nihao"
#向hello队列插入数字,routing_key=‘Hello World!’,body后则是插入的数据
channel.basic_publish(exchange='', #这个exchange参数就是这个exchange的名字. 空字符串标识默认的或者匿名的exchange:如果存在routing_key, 消息路由到routing_key指定的队列中。
routing_key='hello0001',
body='Hello World!',
properties=pika.BasicProperties(
delivery_mode=2, # make message persistent
# 给服务器标记此条消息需要持久化,通过delivery_mode=2设置,
#不管mq是否挂机,此条消息都会存在服务器的消息对列中
))
print(" [x] Sent '开始队列!'")
connection.close()
消费者:
#!/usr/bin/env python
#*- coding:utf-8 -*-
import pika
print("----------------------消费者--------------------")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='192.168.1.152'))
channel = connection.channel()
#创建队列名为hello001,设置持久化队列durable=True
# make message persistent
channel.queue_declare(queue='hello0001', durable=True)
#此代码主要表示:ch向消息对列传送数据,表示数据已经传送成功,不需再传数据
def callback(ch, method, properties, body):
print(" [x] Received %r" % body)
import time
time.sleep(10)
print( 'ok')
ch.basic_ack(delivery_tag = method.delivery_tag)
#表示不按照奇数偶数进行取数据,按照顺寻取数据
channel.basic_qos(prefetch_count=1)
channel.basic_consume(callback,
queue='hello0001',
no_ack=False)
print(' [*] 等待队列. To exit press CTRL+C')
channel.start_consuming()
exchange交换
exchange类型可用: direct , topic , headers 和 fanout 。 我们将要对最后一种进行讲解 --- fanout
exchange type = fanout :表示只有跟exhange绑定连接的所有队列都发消息
exchange type = direct :队列绑定关键
exchange type = topic :绑定几个模糊的关键字
5、发布订阅
aaarticlea/png;base64,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" alt="" />
发布订阅和简单的消息队列区别在于,发布订阅会将消息发送给所有的订阅者,而消息队列中的数据被消费一次便消失。所以,RabbitMQ实现发布和订阅时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中。
exchange type = fanout
#fanout :表示只有跟exhange绑定连接的所有队列都发消息
1、订阅者:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
#连接rabbirmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.152'))
#建立频道
channel = connection.channel()
#创建exchange=logs,type='fanout表示只要跟exchange绑定连接的所有对列都会收到消息
channel.exchange_declare(exchange='logs',
type='fanout')
#随机创建队列名,每一次创建一个队列
result = channel.queue_declare(exclusive=True) #队列断开后自动删除临时队列
queue_name = result.method.queue #队列名采用服务器端分配的临时队列
#绑定队列queue_name
channel.queue_bind(exchange='logs',
queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r" % body)
#通过callback发消息
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
2、发布
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
import sys
#简介rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.152'))
#建立频道
channel = connection.channel()
#创建exchange=logs,type='fanout表示只要跟exchange绑定连接的所有对列都会收到消息
channel.exchange_declare(exchange='logs',
type='fanout')
#接收参数
message = ' '.join(sys.argv[1:]) or "info: Hello World!"
#将message参数信息发到exchange里面
channel.basic_publish(exchange='logs',
routing_key='',
body=message)
print(" [x] Sent %r" % message)
connection.close()
6、关键字发送
aaarticlea/png;base64,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" alt="" />
exchange type = direct
之前事例,发送消息时明确指定某个队列并向其中发送消息,RabbitMQ还支持根据关键字发送,即:队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据 关键字 判定应该将数据发送至指定队列。
生产者:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
print('-----------------生产者发消息---------------')
import sys
#连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(host="192.168.1.152"))
#创建频道
channel= connection.channel()
##随机创建队列名,每一次创建一个队列
channel.exchange_declare(exchange='direct_logs-test',
type='direct')
# severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
# message = ''.join(sys.argv[2:]) or 'nihao lcj'
severity = 'info'
message = '1234567890'
channel.basic_publish(exchange="direct_logs-test",
routing_key=severity, #关键字
body=message)
print(" [x] Sent %r:%r" % (severity, message))
connection.close()
2、消费者
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
import sys
print('---------------------消费者取消息-----------------')
#连接rabbitmq服务器
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='192.168.1.152'))
#创建频道
channel = connection.channel()
#创建exchange=logs,类型为direct
channel.exchange_declare(exchange='direct_logs-test',
type='direct')
#随机创建队列名,每一次创建一个队列
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
#
# severities = sys.argv[1:]
severities = ['info',]
# if not severities:
# sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
# sys.exit(1)
#绑定 severity为动态参数
for severity in severities: #循环取值
channel.queue_bind(exchange='direct_logs-test',
queue=queue_name,
routing_key=severity) #severity传参 print(' [*] Waiting for logs. To exit press CTRL+C')
#等待取数据
def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body))
#
channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
6、模糊匹配
aaarticlea/png;base64,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" alt="" />
exchange type = topic
在topic类型下,可以让队列绑定几个模糊的关键字,之后发送者将数据发送到exchange,exchange将传入”路由值“和 ”关键字“进行匹配,匹配成功,则将数据发送到指定队列。
- # 表示可以匹配 0 个 或 多个 单词
- * 表示只能匹配 一个 单词
发送者路由值 队列中
old.boy.python old.* -- 不匹配
old.boy.python old.# -- 匹配
消费者:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
#创建频道
channel = connection.channel() channel.exchange_declare(exchange='topic_logs',
type='topic') #创建模糊匹配 #随机创建队列
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue binding_keys = sys.argv[1:] #绑定关键字
if not binding_keys: #判断关键字是否存在
sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
sys.exit(1) for binding_key in binding_keys:
channel.queue_bind(exchange='topic_logs',
queue=queue_name,
routing_key=binding_key) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
生产者:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:lcj
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() channel.exchange_declare(exchange='topic_logs',
type='topic') routing_key = sys.argv[1] if len(sys.argv) > 1 else 'anonymous.info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(exchange='topic_logs',
routing_key=routing_key,
body=message)
print(" [x] Sent %r:%r" % (routing_key, message))
connection.close()
python-RabbitMQ基础篇的更多相关文章
- python+selenium基础篇,切入切出frame
1.首先制作一个html的文件,代码如下 <!DOCTYPE html> <html> <head> <title>Frame_test</tit ...
- [python面向对象]--基础篇
1.#类 #类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 #定义一个类 class bar: def foo(self,agr): print(self,agr) obj = bar() ...
- Python学习——基础篇
1.python的安装 python下载地址:https://www.python.org/downloads/ 安装完成后,运行cmd.exe,输入python 如果出现“p ...
- python正则表达式基础篇
1.正则表达式基础 1.1简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...
- Python学习—基础篇之文件操作
文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...
- RabbitMQ基础篇
介绍 RabbitMQ 是一个消息中间件:它接收并转发消息.您可以把它想象为一个邮局:当您把需要寄出的邮件投递到邮箱,邮差最终会把邮件送给您的收件人.在这个比喻中,RabbitMQ 就是一个邮箱,也可 ...
- Python+Selenium基础篇之5-第一个完整的自动化测试脚本
前面文章,我们介绍了如何采用XPath表达式去定位网页元素,在掌握了如何抓取或者如何书写精确的XPath表达式后,我们可以开始写自己的第一个真正意义上的webui 自动化测试脚本,就相当于,你在学习P ...
- 第五篇:Python函数基础篇
本篇介绍什么是函数.函数的特性.函数的定义.函数的调用.以及函数的参数.以及关于全局变量和局部变量的使用等等. 一.什么是函数: 函数是最基本的一种代码抽象方式,为了实现某种特定的功能而组织的带名字的 ...
- 十六、python面向对象基础篇
面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...
- Python ( 学习基础篇 第二部 )
目录 运算符 算数运算符 比较运算符 赋值运算符 位运算符 逻辑运算符 成员运算符 身份运算符 Python 中运算符的优先级 运算符总结基础语法 判断类型 isinstence 代码块 流程控制 w ...
随机推荐
- Setup Factory Error3014
在用Setup Factory打包软件的时候出现Error3014 一般都是由于软件冲突引起的 我的问题是由于杀毒软件 ,在打包的时候关闭杀毒软件 就能成功打包了.
- python新技能get——看!源!码!
上节课一起看了一下ThreadingTCPserver和tornado的源码,真是心力交瘁...后来仔细的想了一下,看懂源码其实并不难,只是需要明确一些以前我们学习过但是却容易被忽视的概念! 再看继承 ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
C#/ASP.NET MVC微信接口开发文章目录: 1.C#/ASP.NET MVC微信公众号接口开发之从零开发(一) 接入微信公众平台 2.C#/ASP.NET MVC微信公众号接口开发之从零开发( ...
- 【代码】verilog之:电子钟
功能:显示时分秒,能够设置时间. 实现:两个按键,一个进入设置,一个加数字.显示用LCD5110 用状态机实现,总共四种状态 idle(正常运行)——s_hour(时设置状态)——s_min(分设置状 ...
- WinForm多线程学习文档
基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...
- CodeForces 686A-Free Ice Cream
题目: 儿童排队领冰激凌,给你两个数n,x分别代表接下来有n行与初始的冰激淋数:接下来n行,每行有一个字符('+'or‘-’),还有一个整数d,+d表示新增的冰激 凌数(由搬运工搬运到此),-d表示儿 ...
- Ubuntu-搜狗输入法
Sougou(搜狗):要换fictx输入法,先删除ibus输入法.搜索sudo apt-get purge ibussudo apt-get autoremove 然后安装fcitx和拼音输入法(要安 ...
- java面试准备之基础排序——冒泡与选择排序
选择排序: [java] public void select(int[] arr){ for(int i=0;i<arr.length;i++){ ...
- 【转】 linux下的g++编译器安装
再debian下直接apt-get install gcc g++就可以了.按照类似的逻辑,再Fedora下yum install gcc g++ 报告无法找到g++包. 查了一下,原来这个包的名字叫 ...
- OC中intValue要注意的地方
在程序中,发现一个问题,写了个例子,如下: NSDictionary * dict = [[NSDictionary alloc] init]; NSString * s ...