首页 > 编程语言 >转:python的zmq模块

转:python的zmq模块

时间:2025-01-11 21:54:21浏览次数:1  
标签:context socket python 模块 input zmq data your

转自:https://www.jianshu.com/p/04660f746a16
https://blog.csdn.net/SweetHeartHuaZai/article/details/126934819

1、zmq介绍:
创建和销毁套接字:zmq.socket(), zmq.close()
配置和读取套接字:zmq.setsockopt(), zmq.getsockopt()
为套接字建立连接:zmq.bind(), zmq.connect()
发送和接收消息:  zmq.send(), zmq.recv()

注:
使用zmq.bind()连接的节点称之为服务端,它有着一个较为固定的网络地址;
使用zmq.connect()连接的节点称为客户端,其地址不固定。

2、zmq消息模式:
主要有三种常用模式: 
req/rep(请求答复模式):主要用于远程调用及任务分配等。 
pub/sub(订阅模式):    主要用于数据分发。 
push/pull(管道模式):  主要用于多任务并行。

3、zmq内置的有效绑定对:
PUB and SUB
REQ and REP
REQ and XREP
XREQ and REP
XREQ and XREP
XREQ and XREQ
XREP and XREP
PUSH and PULL
PAIR and PAIR

4、具体消息模式举例
(1)、req/rep(请求/答复模式):一对一模式,一问一答
#server服务端
import zmq
context=zmq.Context()
socket=context.socket(zmq.REP)  #设置socket的类型,zmq.REP答复
socket.bind("tcp://*:15000")    #绑定服务端的IP和端口

while True:                     #循环接收客户端发来的消息
    message=socket.recv()       #接收客户端发送来的消息,注:是byte类型
    print(message)
    socket.send_string("copy!") #再发回客户端消息
结果:客户单没请求一次就打印一次消息体
b'request'
b'request'
b'request'
b'request'


#client客户端
import zmq, sys
context = zmq.Context()
socket=context.socket(zmq.REQ)          #设置socket类型,请求端
socket.connect("tcp://localhost:15000") #连接服务端的IP和端口

while True:
    data=input("input your request:")
    if data == "q":
        sys.exit()
    socket.send_string(data)           #向服务端发送消息
    message=socket.recv()              #接收服务端返回的消息,注:是byte类型
    print(message)
"""
结果:没输入请求一次,就得到服务端的一次返回
input your data:123
b'copy!'
input your data:456
b'copy!'
"""


(2)、pub/sub(订阅模式):一对多模式
一个发布者,多个订阅者,订阅者可以通过设置过滤器过滤数据。
#publisher发布者
import zmq
context=zmq.Context()
socket=context.socket(zmq.PUB)
socket.bind("tcp://*:15000")
while True:
    data = input("input your data:")
    print(data)
    socket.send_string(data)
"""
结果:循环提示输入数据,当输入一次,就发送一次到订阅者
input your data:123
123
input your data:456
456
input your data:789
789
input your data:
"""


#Subscriber订阅者
import sys
import zmq
context=zmq.Context()
socket=context.socket(zmq.SUB)
socket.connect("tcp://localhost:15000")

socket.setsockopt_string(zmq.SUBSCRIBE,'')

或者:
socket.setsockopt_string(zmq.SUBSCRIBE,'123') #表示只过滤出收到消息为'123'的消息

或者:
socket.subscribe('topic') #订阅一个主题

while True:
    message=socket.recv()
    print(message)
"""
结果:发布者每发布一次,都能订阅到
b'123'
b'456'
b'789'
"""

(3)、push/pull(管道模式):
管道是单向的,从PUSH端单向的向PULL端单向的推送数据流。
由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。
区别于Publish-Subscribe存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端。

#推送端
import zmq
context=zmq.Context()
socket=context.socket(zmq.PUSH)   #设置socket类型PUSH推送
socket.bind("tcp://*:5557")       #绑定IP和端口

while True:
    data=input("input your data:")
    socket.send_string(data)
"""
input your data:123
input your data:456
input your data:789
"""


#worker端
import zmq
context=zmq.Context()
socket_receive=context.socket(zmq.PULL)           #设置socket类型PULL拉取推送端的消息
socket_receive.connect("tcp://localhost:5557")    #连接推送端IP和端口

socket_sender=context.socket(zmq.PUSH)            #再设置一个socket类型PUSH推送
socket_sender.connect("tcp://localhost:5558")     #连接IP和端口向其推送消息

while True:
    data=socket_receive.recv_string()             #拉取接收消息
    print(data)
    socket_sender.send_string(data)               #再将消息推送出去
"""
123
456
789
"""


#拉取端
import zmq
context=zmq.Context()
socket=context.socket(zmq.PULL)    #设置socket类型PULL拉取消息
socket.bind("tcp://*:5558")        #绑定IP和端口去拉取消息
while True:
    message=socket.recv_string()
    print(message)
"""
123
456
789
"""

 

标签:context,socket,python,模块,input,zmq,data,your
From: https://www.cnblogs.com/xuxiaobo/p/18666249

相关文章

  • python+uniapp基于微信小程序的小区服务管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • python+uniapp基于微信小程序的实习生管理系统java+nodejs+php-计算机毕业设计
    目录技术介绍具体实现截图微信开发者工具HBuilderXuniapp系统设计java类核心代码部分展示登录的业务流程的顺序是:可行性论证详细视频演示技术可行性系统测试系统安全性数据完整性实现思路系统实现源码获取技术介绍如今微信小程序有以下发展优势(1)无须下载,无须注......
  • python基础篇总结:数据类型
    在python中数据类型主要是以下9种分别是1.Int(整型);2.Float(浮点型);3.Bool(布尔型);4.Str(字符串);5.None(空值);6.List(列表);7.Tuple(元组);8.Dict(字典);9.Set(集合)等一.Int(整数)整数是Python中最基本的数值类型,用于表示整数值。1.定义整数变量:2.使用内置函数处理整数:3.进行算术运......
  • WiFi+4G摄像头拍照图传模块(夜视2K高清1080P)-关于参考资料,程序移植,新建调用自己的
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/product/audioCamera.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> 关于参考资料......
  • 用Python完成THKA的MODBUS传输
    一、THKA温湿度监控要对THKA温湿度进行监控,采用ModebusRTU通信协议产品的接线图基本通讯协议二、部分代码可以采用QT做个界面,也可以跟数据库进行关联,并在最后可以根据记录的曲线进行做图,上温度获取代码#com打开self._ser=serial.Serial(self.com,self.baud_ra......
  • Python、R用深度学习神经网络组合预测优化能源消费总量时间序列预测及ARIMA、xgboost
    全文链接:https://tecdat.cn/?p=38726原文出处:拓端数据部落公众号分析师:QingxiaWang在能源领域,精准预测能源消费总量对制定合理能源战略至关重要。当前,能源消费预测分析主要运用单一模型(如灰色预测法、时间序列分析法等)和组合模型两种方式。然而,单一模型存在系统误差较高、预测......
  • Python深度学习GRU、LSTM 、BiLSTM-CNN神经网络空气质量指数AQI时间序列预测及机器学
    全文链接:https://tecdat.cn/?p=38742原文出处:拓端数据部落公众号分析师:ZhixiongWeng 人们每时每刻都离不开氧,并通过吸入空气而获得氧。一个成年人每天需要吸入空气达6500升以获得足够的氧气,因此,被污染了的空气对人体健康有直接的影响,空气品质对人的影响更是至关重要。每出现......
  • RT-DETR融合[AAAI2025]的ConSeg中的CDFAPreprocess模块
    RT-DETR使用教程: RT-DETR使用教程RT-DETR改进汇总贴:RT-DETR更新汇总贴《ConDSeg:AGeneralMedicalImageSegmentationFrameworkviaContrast-DrivenFeatureEnhancement》一、模块介绍    论文链接:https://arxiv.org/abs/2412.08345    代......
  • 【深度学习】CAB:通道注意力模块
    @[toc]CAB:通道注意力模块CAB:通道注意力模块CAB(ChannelAttentionBlock)是一种通道注意力模块,通常用于计算机视觉任务中,特别是在图像恢复、超分辨率、去噪等任务中。它的核心思想是通过学习通道之间的依赖关系,自适应地调整每个通道的特征响应,从而增强模型对重要特征的提......
  • enum模块(枚举类型)
    enum模块:pythonenum模块提供了枚举功能。有些编程语言是内置了枚举类型,但python没有内置,只是用enum模块里的Enum类来实现类似功能。如果不使用枚举,我们一般会采用定义常量的方式来处理。比如下面代码:RED,GREEN,YELLOW=range(3)下面演示了一个常见的enum类的创建:fromenu......