ZeroMQ:使用带有REQ / REP的DEALER / ROUTER,但它仍然需要发送/接收对

时间:2017-07-24 21:38:58

标签: zeromq

我使用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

因为它仍然希望通信是请求 - 回复对。如何在不等待回复的情况下避免这种锁定性质并发送和接收任何次数?

2 个答案:

答案 0 :(得分:0)

ZeroMQ正式模式封装了他们的某些行为。

如果这种特殊行为不是您喜欢的行为,那么就不要使用那种不符合您需求的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()

注意:您的示例不能正常工作,因为REQREP都连接到端口5558.我使用5559,所以最后我们有:< / p>

DEALER -> ROUTER -> DEALER -> REP