什么ZeroMQ套接字类型用于进程间通信?

时间:2014-06-09 14:06:23

标签: c ipc zeromq

当我有两个线程时,我使用了PAIR套接字类型。但现在我使用两个进程,可以在一台机器上,也可以在不同的机器上。我不需要请求和响应,我不需要发送到多个节点等。我需要与PAIR(异步,双向)相同的东西,但是需要进程和网络。我应该使用哪种套接字类型?

2 个答案:

答案 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
>>>