Python zmq的三种简单模式
ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。
是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。
ZMQ 让编写高性能网络应用程序极为简单和有趣。
ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议。
它有自己的模式,不同于更底层的点对点通讯模式。
它有比tcp协议更高一级的协议。(当然ZeroMQ不一定基于TCP协议,它也可以用于进程间和进程内通讯)
zeromq
并不是类似rabbitmq
消息列队,它实际上只一个消息列队组件,一个库。
zeromq的几种模式
Request-Reply模式(请求响应模型):
客户端在请求后,服务端必须回响应
由客户端发起请求,并等待服务端响应请求。从客户端端来看,一定是一对对发收配对的;
反之,在服务端一定是收发对。服务端和客户端都可以是1:N的模型。通常把1认为是server,N认为是Client。
ZMQ可以很好的支持路由功能(实现路由功能的组件叫做Device),把1:N扩展为N:M(只需要加入若干路由节点)。
从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含回应地址,而应用则不关心它
服务端:
# sever.py
import zmq
import sys
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
try:
print("wait for client ...")
message = socket.recv()
print("message from client:", message.decode('utf-8'))
socket.send(message)
except Exception as e:
print('异常:',e)
sys.exit()
客户端:
#client.py
import zmq
import sys
context = zmq.Context()
print("Connecting to server...")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
while True: input1 = input("请输入内容:").strip()
if input1 == 'b':
sys.exit()
socket.send(input1.encode('utf-8')) message = socket.recv()
print("Received reply: ", message.decode('utf-8'))
Publish-Subscribe模式(发布订阅模型):
广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。
服务端
server.py
import zmq
import time
import sys
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5555") while True:
msg = input("请输入要发布的信息:").strip()
if msg == 'b':
sys.exit()
socket.send(msg.encode('utf-8'))
time.sleep(1)
客户端1
client1.py
import zmq context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt(zmq.SUBSCRIBE,''.encode('utf-8')) # 接收所有消息
while True:
response = socket.recv().decode('utf-8');
print("response: %s" % response)
客户端2
client2.py
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5555")
socket.setsockopt(zmq.SUBSCRIBE,'123'.encode('utf-8')) # 消息过滤 只接受123开头的信息
while True:
response = socket.recv().decode('utf-8');
print("response: %s" % response)
运行结果:
发布端发布以下信息(注意:b是关闭发布端的指令):
请输入要发布的信息:hello python
请输入要发布的信息:大唐不夜城
请输入要发布的信息:123435678
请输入要发布的信息:123我爱你
请输入要发布的信息:广播模式,发布端只关心发布信息,不关心订阅端是否接收
请输入要发布的信息:b
客户端1接收的信息:
response: hello python
response: 大唐不夜城
response: 123435678
response: 123我爱你
response: 广播模式,发布端只关心发布信息,不关心订阅端是否接收
客户端2接收的信息:
response: 123435678
response: 123我爱你
Parallel Pipeline模式(管道模型):
由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端。
server.py
import zmq
import time context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:5557") while True:
msg = input("请输入要发布的信息:").strip()
socket.send(msg.encode('utf-8'))
print("已发送")
time.sleep(1)
worker.py
import zmq
context = zmq.Context()
receive = context.socket(zmq.PULL)
receive.connect('tcp://127.0.0.1:5557')
sender = context.socket(zmq.PUSH)
sender.connect('tcp://127.0.0.1:5558') while True:
data = receive.recv()
print("正在转发...")
sender.send(data)
client.py
import zmq
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://*:5558") while True:
response = socket.recv().decode('utf-8')
print("response: %s" % response)
结果:
server端:
请输入要发布的信息:hello python
已发送
请输入要发布的信息:王者不可阻挡
已发送
请输入要发布的信息:123abc
已发送
请输入要发布的信息:
work端
正在转发...
正在转发...
正在转发...
client端:(接收第二条信息后断开,断开后重新收到的信息)
response: 123abc
Python zmq的三种简单模式的更多相关文章
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
- python—字符串拼接三种方法
python—字符串拼接三种方法 1.使用加号(+)号进行拼接 字符串拼接直接进行相加就可以,比较容易理解,但是一定要记得,变量直接相加,不是变量就要用引号引起来,不然会出错,另外数字是要转换为字 ...
- python编程(python开发的三种运行模式)【转】
转自:http://blog.csdn.net/feixiaoxing/article/details/53980886 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 单循环 ...
- Python队列的三种队列方法
今天讲一下队列,用到一个python自带的库,queue 队列的三种方法有: 1.FIFO先入先出队列(Queue) 2.LIFO后入先出队列(LifoQueue) 3.优先级队列(PriorityQ ...
- python程序的三种控制结构
程序的三种控制结构 什么是控制结构? """ 程序有三种基本结构组成:顺序结构.分支结构.循环结构.任何程序都是由这三种基本结构组成. 顺序结构是程序按照线性顺序依次执行 ...
- python程序的三种执行结构
一.分支结构:根据条件判断的真假去执行不同分支对应的子代码 1.1 if判定 完整语法如下: if 条件1: #条件可以是任意表达式,如果条件1为True,则依次执行代码. 代码1 代码2 ... e ...
- Python中的三种数据结构
Python中,有3种内建的数据结构:列表.元组和字典.1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这 ...
- python之asyncio三种应用方法
1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...
- python学习Day8 三种字符类型、文件操作
复习 类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-.5') | ...
随机推荐
- 亲测可用的优雅的在已经安装了python的Ubuntu上安装python3.5
我的Ubuntu上已经安装了python2.7和3.4. 用以下方法可以方便的顺利的安装python3.5,使用的时候也不会发生冲突. 一条一条输入以下语句 wget https://www.pyth ...
- 15 道 Spring Boot 高频面试题,看完直接当面霸【入门实用】
前言 本文转自松哥(网名:江南一点雨)的一篇实用入门文章,写的挺好的,希望对各位有所帮助. 什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路 ...
- 两个int数组对比,返回差异数据
public static int[] DataDifference(int[] more, int[] few) { //差异Id var sbuNoItapSessionId = new int[ ...
- 「Luogu P1210」回文检测 解题报告
题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...
- DLC双端锁,CAS,ABA问题
一.什么是DLC双端锁?有什么用处? 为了解决在多线程模式下,高并发的环境中,唯一确保单例模式只能生成一个实例 多线程环境中,单例模式会因为指令重排和线程竞争的原因会出现多个对象 public cla ...
- Activity启动过程源码分析(Android 8.0)
Activity启动过程源码分析 本文来Activity的启动流程,一般我们都是通过startActivity或startActivityForResult来启动目标activity,那么我们就由此出 ...
- Linux网络管理之多网卡绑定
一.bonding介绍 在企业Linux服务器管理里中,服务器的可靠性.可用性以及I/O速度都非常重要,保持服务器的高可用和安全性是生产环境的重要指标,其中最重要的一点是服务器网络连接的高可用性.通常 ...
- 如何制作地图故事使用esri story maps
博客作者原创 制作方法如下:http://url.cn/5dnsVQd
- Python学习中的“按位取反”笔记总结
| 疑惑 最近在学习Python的过程中了解到位运算符,但对于按位取反有点迷糊,就比如说~9(按位取反)之后的结果是-10,为什么不是6呢?所以下面就来看看为什么不是6,正确结果是如何计算出来的呢? ...
- Spring学习记录3——Spring AOP
SpringAOP基础 AOP简介: AOP是Aspect Oriented Programing的简称,翻译为“面向切面编程”.它适用于具有横切逻辑的应用场合,如性能检测,访问控制,事务管理及日志记 ...