zeroMQ初体验-15.应答模式进阶(一)-数据的封装

整整一大章全部讲的应答模式的进阶,应该很重要吧(简直是一定的)。

上一节讲到了发布/订阅模式 关于封装的话题,在应答模式中也是如此,不过这个动作已经被底层(zeromq)接管,对应用透明。而其中普通模式与X模式又有区别,例如:req连接Xrep:
[img]http://github.com/imatix/zguide/raw/master/images/fig29.png[/img]
说明:
第三部分是实际发送的数据
第二部分是REQ向XREP发送请求时底层附加的
第一部分是XREP自身地址
注意:
前文已经说过,XREP其实用以平衡负载,所以这里由它对请求数据做了封装操作,如果通过多个XREP,数据结构就会变成这个样子:[img]http://github.com/imatix/zguide/raw/master/images/fig30.png[/img]
同时,如果没有启用命名机制,XREP会自动赋予临时名字:
[img]http://github.com/imatix/zguide/raw/master/images/fig31.png[/img]
不然,就是这样了:
[img]http://github.com/imatix/zguide/raw/master/images/fig32.png[/img]

这里给出一个验证代码:

import zmq
import zhelpers

context = zmq.Context()

sink = context.socket(zmq.XREP)
sink.bind("inproc://example")

# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)

# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)


上面的代码用到的zhelpers:

from random import randint

import zmq


# Receives all message parts from socket, prints neatly
def dump(zsocket):
print "----------------------------------------"
for part in zsocket.recv_multipart():
print "[%03d]" % len(part),
if all(31 < ord(c) < 128 for c in part):
print part
else:
print "".join("%x" % ord(c) for c in part)


# Set simple random printable identity on socket
def set_id(zsocket):
identity = "%04x-%04x" % (randint(0, 0x10000), randint(0, 0x10000))
zsocket.setsockopt(zmq.IDENTITY, identity)


(未完待续)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值