我正在尝试使用ZeroMQ,我有一个 PUSH
应用程序,可以发送大约370,000条消息,每条消息大小为10Kb。
context = zmq.Context()
socket = context.socket( zmq.PUSH )
socket.bind( "tcp://127.0.0.1:5557" )
no_msgs = 0
i = 370000
fd = open( "input_text_files/file1.txt", 'r' )
msg = fd.read()
while i > 0:
print "Sending data of size" , len( msg )
rc = socket.send( msg )
no_msgs += 1
if rc == None:
print True
if rc == -1:
print "ERROR!!"
i = i-1
PULL
应用程序刚刚收到循环中的消息:
context = zmq.Context()
socket = context.socket( zmq.PULL )
socket.connect( "tcp://127.0.0.1:5557" )
no_msgs = 1
i = 1
while True:
msg = socket.recv()
no_msgs += 1
print "Received msg", i
print "Received %s" %( len( msg ) )
i = i + 1
使用此设置时,会丢失消息,即PULL
套接字未收到所有370,000条消息。我在socket.hwm = 10
套接字上添加了PUSH
,并收到了所有370,000封邮件。有人可以向我解释这是如何工作的吗?
答案 0 :(得分:1)
ZeroMQ .Context()
实例
可能是,开始阅读有关ZeroMQ内部的内容,接下来尝试区分非阻塞v / s阻塞操作模式。
ZMQ_RCVBUF: Set kernel receive buffer size | default -1 == O/S def'd
ZMQ_RCVHWM: Set high water mark for inbound messages | default 1000
ZMQ_SNDBUF: Set kernel transmit buffer size | default -1 == O/S def'd
ZMQ_SNDHWM: Set high water mark for outbound messages| default 1000
ZMQ_SNDHWM
选项应为指定套接字上的出站消息设置高水位标记。高水位标记是对于指定套接字正在与之通信的任何单个对等方,内存在内存中排队的未完成消息的最大数量的硬限制。值为零意味着没有限制。如果达到此限制,套接字应进入异常状态,并且根据套接字类型,ØMQ应采取适当的措施,例如阻止或丢弃已发送的消息。有关为每种套接字类型采取的确切操作的详细信息,请参阅
zmq_socket(3)
中的各个套接字说明。ØMQ不保证套接字将接受
ZMQ_SNDHWM
个消息,并且实际限制可能会低60-70%,具体取决于消息流套接字。
管道节点使用类型为
ZMQ_PUSH
的套接字将消息发送到下游管道节点。消息被循环到所有连接的下游节点。此套接字类型未实现zmq_recv()
函数。当
ZMQ_PUSH
套接字因所有下游节点达到高水位而进入静音状态时,或者如果没有下游节点 at所有,然后套接字上的任何zmq_send(3)
操作都应阻止,直到静音状态结束或至少有一个下游节点可用于发送;消息不会被丢弃。
PULL
侧设置
ZMQ_RCVHWM
选项应为指定套接字上的入站消息设置高水位标记。 高水位标记是对于指定套接字正在与之通信的任何单个对等方,ØMQ应在内存中排队的未完成消息的最大数量的硬限制。值为零意味着没有限制 如果达到此限制,套接字应进入异常状态,并且根据套接字类型,ØMQ应采取适当的措施,例如阻止或丢弃发送的消息。有关为每种套接字类型采取的确切操作的详细信息,请参阅zmq_socket(3)
中的各个套接字说明。