当我只有两个线程时,我使用了PAIR套接字类型。但现在我正在使用两个进程,它们可以位于同一台机器上,也可以位于不同的机器上。我不需要请求和响应,也不需要向多个节点发送数据等。我需要与PAIR相同的东西(异步、双向),但是需要使用进程和网络。我应该使用哪种套接字类型?
PAIR/PAIR
套接字配对的模拟。 ROUTER/DEALER
,甚至是 DEALER/ DEALER
(正如您在评论中建议的那样)来实现您想要的东西。这些套接字有点类似于 REQ/REP
,但它们不强制要求严格的请求/响应通信模式,它们完全没有限制,因此实际上您获得了相同的效果。唯一的问题是,如果您想要添加更多节点,则必须开始以稍微不同的方式进行管理,特别是 DEALER
套接字不允许您选择发送到哪个节点,它严格按照轮询方式处理。 ROUTER
套接字类型可能需要额外的复杂性,因为您需要跟踪另一个节点的“标识符”才能将消息发送回它(您可以从发送的消息中直接获得这个标识符,尤其是在您只有一个对等点的情况下,几乎可以免费使用)。由于这是一个独占对,您可以忽略 DEALER
套接字引入的轮询不确定性,并直接使用 DEALER/ DEALER
,它为您提供了不受限制的消息模式,并且不需要管理任何标识。@Marko提醒我注意,
ZMQ.SOCKET(正式通信模式)的"type"和任何一种传输方式之间存在主要分离,无论您选择使用哪种传输方式.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
>>>
://inproc
表现最佳。 - user3666197