转:python的zmq模块

news/2025/1/11 21:48:04/文章来源:https://www.cnblogs.com/xuxiaobo/p/18666249
转自: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 PAIR4、具体消息模式举例 (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
"""

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867924.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度强化学习实战:训练DQN模型玩超级马里奥兄弟

深度学习作为当前计算机科学领域最具前沿性的研究方向之一,其应用范围涵盖了从计算机视觉到自然语言处理等多个领域。本文将探讨深度学习在游戏领域的一个具体应用:构建一个能够自主学习并完成超级马里奥兄弟的游戏的智能系统。强化学习基础 强化学习是机器学习的一个重要分支…

导出和导入word样式模板

对于自己配置过之后常用的word样式可以导出作为样式模板, 可以重复使用.举例说一下哪些是常用的word样式, 例如: (常见的): 中文的内容的样式, 中英文分别设置不同的样式 (比较高级的)多级标题自动编号, 题注跟随标题的编号word功能 word自带导出导入模板样式的功能. word样式模…

远程连接和FTP传输问题

遇到的远程连接和FTP传输问题,我们进行了详细调查。以下是我们的分析和建议:远程桌面连接问题:端口检查:默认情况下,Windows系统的远程桌面服务使用的是3389端口。请确保该端口未被防火墙或其他安全软件阻塞。可以通过命令行工具netstat -an | findstr 3389来检查端口状态…

宝塔面板无法登录,如何重置密码并恢复正常访问?

当您遇到宝塔面板无法登录的问题时,可能是由于密码遗忘、凭据错误或服务器配置问题引起的。为了帮助您更好地理解和解决这个问题,以下是几个可能的原因及相应的解决方案:检查凭据是否正确首先,请确认您输入的用户名和密码是否正确。宝塔面板默认的用户名是admin,初始密码通…

网站偶尔无法访问或加载不完全

网站偶尔出现无法访问或无法加载所有网页的情况,这可能是由多种因素引起的。为了帮助您更好地排查和解决问题,建议您按照以下步骤进行检查:检查服务器资源使用情况:首先,确认服务器的带宽、CPU、内存等资源是否正常。可以通过服务器监控工具(如阿里云的云监控)查看实时资…

云服务器登录无权限,Nginx无法启动

服务器系统可能处于只读状态,导致您无法正常登录并修改配置文件。我们已经为您进入单用户模式修复了文件系统,现在Nginx可以正常运行了。非常感谢您长期对我司的支持! 出现这种情况的原因可能是某些程序未正常停止,导致文件系统出现问题。建议您以后多观察服务器的状态,确…

恢复丢失的网站数据及提供后台密码的方法

用户报告称其网站数据已丢失,急需恢复备份的数据库并获取后台管理密码。这种情况严重影响了网站的正常运营,必须尽快解决。 解决方案:确认备份可用性:首先,确认是否有可靠的备份文件可供恢复。检查服务器上的自动备份机制或之前手动创建的备份文件。如果没有现成的备份,询…

如何使用一段代码修改网站内容

在网站开发中,使用一段代码可以快速修改网站内容。以下是详细的步骤和注意事项:确定要修改的内容:确定您要修改的具体内容,例如文本、图片、链接等。 找到包含该内容的HTML文件或模板文件。获取FTP信息:从您的网站托管商处获取FTP登录信息,包括FTP服务器地址、用户名、密…

如何使用织梦CMS(DedeCMS)修改网站

织梦CMS(DedeCMS)是一款广泛使用的开源内容管理系统,适用于各种类型的网站。以下是使用织梦CMS修改网站的详细步骤和注意事项:登录织梦CMS后台:使用管理员账户登录织梦CMS后台。通常,后台地址为域名/dede或域名/admin。 输入用户名和密码,点击“登录”按钮。找到内容管理…

塔面板指南 - 快速更换网站域名的详细步骤与注意事项

使用宝塔面板搭建和管理网站时,有时需要更换域名。以下是详细的步骤和注意事项,确保您能够顺利地完成域名修改:备份现有数据在执行任何可能导致配置变更的操作之前,务必备份完整的数据库和文件副本。这不仅是应对突发状况的有效措施,也是恢复历史版本的基础保障。大多数服…

域名解析与托管服务 - 设置虚拟主机和数据库的最佳实践

正确设置域名解析地址和管理虚拟主机及数据库是确保网站正常运行的关键。以下是关于如何配置这些服务的详细指南:设置域名解析如果客户域名在其他公司注册,而空间托管在我司,建议将域名别名(CNAME记录)解析到我司提供的二级域名上。例如,将example.com的CNAME记录指向you…