当我有两个线程时,我使用了PAIR套接字类型。但现在我使用两个进程,可以在一台机器上,也可以在不同的机器上。我不需要请求和响应,我不需要发送到多个节点等。我需要与PAIR(异步,双向)相同的东西,但是需要进程和网络。我应该使用哪种套接字类型?
答案 0 :(得分:2)
不幸的是,你的世界变得更加复杂了。在更广泛分布的系统中,PAIR/PAIR
套接字配对没有直接模拟。
也就是说,如果您保持大致相同的拓扑形状(两个节点彼此独立连接而没有其他节点),那么您可以使用ROUTER/DEALER
甚至{{1}来实现您想要的效果(正如你在评论中所建议的那样)。这些套接字有点像DEALER/DEALER
,但它们没有强制执行严格的请求/响应通信模式,它们完全不受限制,所以实际上你会得到同样的东西。如果您打算添加更多节点,唯一的问题就出现了,此时您必须以不同的方式开始管理,特别是REQ/REP
套接字不允许您选择发送到哪个节点,它和#39;严格循环。
但是,这样做可以让你得到你正在寻找的东西(异步,双向)。
DEALER
套接字类型可能需要一些额外的复杂性,因为您需要跟踪"标识符"能够发回给它的另一个节点(你可以免费获得这个几乎,特别是在你只有一个对等的情况下,直接从发送的消息中使用它)。因为这是一个独占配对,您可以忽略ROUTER
套接字引入的循环不确定性,直接转到DEALER
,它会为您提供不受限制的消息模式,并且不需要任何身份管理。
答案 1 :(得分:0)
@Marko让我注意到,
在ZMQ.SOCKET(正式通信模式)“类型”与任何传输之间存在主要分离,人们选择.bind()
/ .connect()
结束
一旦您的架构很满意(正如您所写),就可以使用PAIR / PAIR“会话”
您可能只是没有一个额外的SLOC更改要使用的传输
有效
Python 2.7.3 ...
>>> import zmq
>>> zmq.zmq_version()
'2.1.11'
>>> aZmqCONTEXT = zmq.Context() # --<BoCTX>-- [SideA] Node
>>> aZmqSOCKET = aZmqCONTEXT.socket( zmq.PAIR ) # here one decides about a type
>>> aZmqSOCKET.bind( "tcp://192.168.0.62:2027" ) # here is the transport // used to be ( "ipc://...")
>>> aZmqSOCKET.recv() # here the PAIR waits for 1st MSG
'aMSG from the opposite PAIR/PAIR zmq-session Node arrived via TCP-transport ... QED'
>>> aZmqSOCKET.setsockopt( zmq.LINGER, 0 ) # pre-termination tidy-up
>>> aZmqSOCKET.close()
>>> aZmqCONTEXT.term() # --<EoCTX>-- safe to clean-exit
>>>