设为首页 收藏本站
查看: 935|回复: 0

[经验分享] python ZMQ的简单使用

[复制链接]

尚未签到

发表于 2015-11-30 09:40:56 | 显示全部楼层 |阅读模式
  参考网址:http://zhou-xingbo.iyunv.com/blog/951859
  常用的通讯模式有三类(两个解释都挺好,先保存下来):
1. 请求应答模式(Request-Reply)
  消息双向的,有来有往,req端请求的消息,rep端必须答复给req端
2. 订阅发布模式 (sub 和 pub)
  消息单向的,有去无回的。可按照发布端可发布制定主题的消息,订阅端可订阅喜欢的主题,订阅端只会收到自己已经订阅的主题。发布端发布一条消息,可被多个订阅端同事收到。
3. push pull模式
    消息单向的,也是有去无回的。push的任何一个消息,始终只会有一个pull端收到消息.
后续的代理模式和路由模式等都是在三种基本模式上面的扩展或变异。
  1.请求回应模型。由请求端发起请求,并等待回应端回应请求。从请求端来看,一定是一对对收发配对的;
  反之,在回应端一定是发收对。请求端和回应端都可以是1:N的模型。通常把1认为是server,N认为是Client。
  0MQ可以很好的支持路由功能(实现路由功能的组件叫做Device),把1:N扩展为N:M(只需要加入若干路由节点)。
  从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含回应地址,而应用则不关心它。
  2.发布订阅模型。这个模型里,发布端是单向只发送数据的,且不关心是否把全部的信息都发送给订阅者。
  如果发布端开始发布信息的时候,订阅端尚未连接上,这些信息直接丢弃。
  不过一旦订阅端连接上来,中间会保证没有信息丢失。
  同样,订阅端则只负责接收,而不能反馈。
  如果发布端和订阅端需要交互(比如要确认订阅者是否已经连接上),则使用额外的socket采用请求回应模型满足这个需求。
  3.管道模型。这个模型里,管道是单向的,从PUSH端单向的向PULL端单向的推送数据流。
  
  我使用的是请求回应模型,server为REP模式,等待消息,client为REQ模式,向server请求消息。
  一个最简单的例子:
  server.py



import zmq  
context = zmq.Context()  
socket = context.socket(zmq.REP)  
socket.bind("tcp://*:5555")  
message = socket.recv()  
print "message from client:", message  
#  Send reply back to client  
socket.send("World")  
  client.py



import zmq  
context = zmq.Context()  
print "Connecting to server..."  
socket = context.socket(zmq.REQ)  
socket.connect ("tcp://localhost:5555")  
socket.send ("Hello")  
message = socket.recv()  
print "Received reply: ", message
  运行结果:
  $ python server.py
message from client: Hello
  $ python client.py
Connecting to server...
Received reply:  World

  一个解决了我很多疑问的网址:



http://www.searchtb.com/2012/08/zeromq-primer.html
  其中说明了:
  a) 服务端和客户端无论谁先启动,效果是相同的,这点不同于Socket。
  b) 在服务端收到信息以前,程序是阻塞的,会一直等待客户端连接上来。
  c) 服务端收到信息以后,会send一个“World”给客户端。值得注意的是一定是client连接上来以后,send消息给Server,然后 Server再rev然后响应client,这种一问一答式的。如果Server先send,client先rev是会报错的。
  d) ZMQ通信通信单元是消息,他除了知道Bytes的大小,他并不关心的消息格式。因此,你可以使用任何你觉得好用的数据格式。Xml、Protocol Buffers、Thrift、json等等。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145196-1-1.html 上篇帖子: Python中ValueError: invalid literal for int() with base 10 的实用解决办法 下篇帖子: python的类装饰器和单例模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表