我使用DEALER/ROUTER
来避免REQ / REP的阻塞性质
我有 REP
代码:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.connect("tcp://127.0.0.1:5558")
while True:
x = socket.recv()
print 'REQ is', x, y
reply = 'x-%s' % x
socket.send(reply)
print 'REP is', reply
REQ
部分:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5558")
for x in xrange(10):
socket.send(str(x))
print 'REQ is', x
print "REP is", socket.recv()
经纪人代码:
import sys
import zmq
context = zmq.Context()
s1 = context.socket(zmq.ROUTER)
s2 = context.socket(zmq.DEALER)
s2.bind("tcp://127.0.0.1:5558")
s1.bind("tcp://127.0.0.1:5559")
zmq.device(zmq.QUEUE, s1, s2)
当我在send()
代码上 REQ
两次时,我收到以下错误:
zmq.error.ZMQError: Operation cannot be accomplished in current state
因为它仍然希望通信是请求 - 回复对。如何在不等待回复的情况下避免这种锁定性质并发送和接收任何次数?
答案 0 :(得分:0)
如果这种特殊行为不是您喜欢的行为,那么就不要使用那种不符合您需求的ZeroMQ正式可扩展通信模式。
那很简单。
例如,可以尝试使用 PUSH/PULL
原型,因为您可以拥有与{c}}一样多的.send()
- s的无限制自由。
也可以在ZeroMQ上享受我的其他帖子,在那里也可以找到Pieter HINTJENS的直接网址预订“Code Connected。第1卷”如果一个人真的愿意进入,必须阅读分布式计算域。 值得一个人的时间和努力。
答案 1 :(得分:0)
ZeroMQ中的 REQ
套接字始终在发送和接收之间交替。但是,您可以在"客户端"中使用 DEALER
套接字而不是REQ
套接字。如果你想发送多条消息:
import zmq
context = zmq.Context()
socket = context.socket(zmq.DEALER)
socket.connect("tcp://127.0.0.1:5559")
for x in xrange(10):
socket.send('',zmq.SNDMORE)
socket.send(str(x))
print 'REQ is', x
for x in xrange(10):
print "REP is", socket.recv()
注意:您的示例不能正常工作,因为REQ
和REP
都连接到端口5558.我使用5559,所以最后我们有:< / p>
DEALER -> ROUTER -> DEALER -> REP