上面一篇是说到了工作队列,每次消息都只会发送给其中一个接收端,如果需要将消息广播出去,让每个接收端都能收到,那么就要使用交换机。

交换机的工作原理:消息发送端先将消息发送给交换机,交换机再将消息发送到绑定的消息队列,而后每个接收端都能从各自的消息队列里接收到信息。

rabbitmq交换机工作原理

下面用send.py和receive.py来模拟实现交换机的功能。send.py表示发送端,receive.py表示接收端。

receive.py代码分析

和第一篇里的receive.py相比,主要是做了两个改动:

定义交换机

不使用hello队列了,随机生成一个临时队列,并绑定到交换机上

#!/usr/bin/env python

#coding=utf8

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(

'localhost'))

channel = connection.channel()

#定义交换机

channel.exchange_declare(exchange='messages', type='fanout')

#随机生成队列,并绑定到交换机上

result = channel.queue_declare(exclusive=True)

queue_name = result.method.queue

channel.queue_bind(exchange='messages', queue=queue_name)

def callback(ch, method, properties, body):

print " [x] Received %r" % (body,)

channel.basic_consume(callback, queue=queue_name, no_ack=True)

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

channel.start_consuming()

上例代码中,queue_declare的参数exclusive=True表示当接收端退出时,销毁临时产生的队列,这样就不会占用资源。运行这个程序,然后使用rabbitmqctl list_exchanges命令来查看交换机信息:

rabbitmq交换机信息查看

其中红色框就是上例定义的交换机了。再使用rabbitmqctl list_queues查看下消息队列情况:

rabbitmq队列信息查看

其中红色框就是随机产生的消息队列了。

send.py代码分析

和第一篇的send.py相比,也只做了两个改动:

定义交换机

不是将消息发送到hello队列,而是发送到交换机

#!/usr/bin/env python

#coding=utf8

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(

'localhost'))

channel = connection.channel()

#定义交换机

channel.exchange_declare(exchange='messages', type='fanout')

#将消息发送到交换机

channel.basic_publish(exchange='messages', routing_key='', body='Hello World!')

print " [x] Sent 'Hello World!'"

connection.close()

上例代码中, basic_publish方法的参数exchange被设定为相应交换机,因为是要广播出去,发送到所有队列,所以routing_key就不需要设定了。

exchange如果为空,表示是使用匿名的交换机,在上面交换机信息的图片中可以看到有amq.*这样的交换机,就是系统默认的交换机了。routing_key在使用匿名交换机的时候才需要指定,表示发送到哪个队列的意思。第一篇的例子演示了这个功能。

打开另外一个终端,执行send.py,可以观察到receive.py接收到了消息。如果有多个终端执行receive.py,那么每个receive.py都会接收到消息。

python send 案例_python使用rabbitmq实例三,交换机相关推荐

  1. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  2. python send 案例_python之pexpect实现自动交互的例子

    Pexpect 是 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. Pexpect 的使用范围 ...

  3. python自动化发送邮件_python接口自动化(三十三)-python自动发邮件总结及实例说明番外篇——下(详解)...

    简介 发邮件前我们需要了解的是邮件是怎么一个形式去发送到对方手上的,通俗点来说就是你写好一封信,然后装进信封,写上地址,贴上邮票,然后就近找个邮局,把信仍进去,其他的就不关心了,只是关心时间,而电子邮 ...

  4. python网络编程案例_python网络编程实例简析

    本文实例讲述了python网络编程,分享给大家供大家参考. 具体方法如下: 服务端代码如下: from SocketServer import(TCPServer as TCP, StreamRequ ...

  5. python死锁案例_python避免死锁方法实例分析

    本文实例讲述了python避免死锁方法.分享给大家供大家参考.具体分析如下: 当两个或者更多的线程在等待资源的时候就会产生死锁,两个线程相互等待. 在本文实例中 thread1 等待thread2释放 ...

  6. python中continue用法案例_Python continue语句实例用法

    Python continue语句: 当执行到 continue 语句时,将不再执行本次循环中 continue 语句接下来的部分,而是继续下一次循环. lst = [7,8,9,4,5,6] for ...

  7. python备份文件最简单案例_Python实现备份文件实例

    本文实例讲述了Python实现备份文件的方法,是一个非常实用的技巧.分享给大家供大家参考.具体方法如下: 该实例主要实现读取一个任务文件, 根据指定的任务参数自动备份. 任务文件的格式: (注意,分号 ...

  8. 中国大学排名python爬虫_Python爬虫入门实例三之爬取软科中国大学排名

    写在前面 这个例子是笔者今天在中国大学MOOC(嵩天 北京理工大学)上学习的时候写下来的.但是很快写完之后我就发现不对劲,首先课程给的例子是中国好大学网站的排名,但是现在这个网站已经重构了,原来的链接 ...

  9. python的面向对象编程项目案例_python面向对象编程实例ants vs bees

    [实例简介] 本实例为用python语言编写,以python的面向对象.列表.局部变量等部分知识为基础,内容类似于popcap的植物大战僵尸的游戏项目 本实例为UC berkeley课程CS61A的p ...

最新文章

  1. mysql数据库的字符串表示什么意思_MySQL数据库的字符串类型详解(01)
  2. 这样去写你的 HTML
  3. html5 筛子,html5摇骰子游戏
  4. 构建自己的简单微服务架构(开源)
  5. docker 安装mysql5.6
  6. 如何设置显示内容而不是显示对象
  7. Java的三大特性:封装、继承、多态
  8. 利用栈和队列将队列中的元素逆置☆
  9. stm32c语言long型数据多少位,stm32 C语言的数据类型说明
  10. Bzoj 3196 Tyvj 1730 二逼平衡树
  11. 三、系统的开关机和PDC简介
  12. Excel2010学习笔记(二):公式函数篇
  13. 创建两个Thread子类,第一个用run()方法启动,并捕获第二个Thread对象的句柄,然后调用wait()。第二个类的run()方法几秒后为第一个线程调用notifAll(),使第一个线程打印消息
  14. Q99:当Bezier曲面(Utah Teapot)同时遇上“噪声纹理”和“Phong反射模型”
  15. unity素材二:三个老头欧系战士模型带动作特效
  16. OpenGL——顶点属性
  17. 小白也能通俗易懂的联邦学习!
  18. 让html 自动换行,怎样让HTML 表格中内容自动换行??
  19. 邮件发送:Could not connect to SMTP host: 10.0.76.11, port: 25
  20. 饥荒海难机器人怎么用_饥荒海难机器人作用详解 饥荒海难机器人有什么用

热门文章

  1. STL10-deque容器
  2. Nginx 快速搭建HTTP 文件服务器
  3. java并发-内存模型与volatile
  4. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)
  5. object类型转换为Array类型
  6. [bzoj1036][ZJOI2008]树的统计Count
  7. 【FFMPEG】【ARM-Linux开发】 ffmpeg 静态库使用,undefined reference错误
  8. 传感器系列之4.3流量传感器
  9. base64_encode() 和 base64_decode() 8bit图片通过网络传输
  10. RabbitMQ 原文译03--发布和订阅