我正在尝试在 PUSH/PULL
模式下将 python
与 zeroMQ
一起使用,发送大小为 4[MB] 每隔几秒。
由于某种原因,虽然看起来所有消息都已发送,但服务器似乎只收到了其中的一部分。我在这里错过了什么?
这是客户端的代码 -- client.py
import zmq
import struct
# define a string of size 4[MB]
msgToSend = struct.pack('i', 45) * 1000 * 1000
context = zmq.Context()
socket = context.socket(zmq.PUSH)
socket.connect("tcp://127.0.0.1:5000")
# print the message size in bytes
print len(msgToSend)
socket.send(msgToSend)
print "Sent message"
这是服务器的代码 -- server.py
import zmq
import struct
context = zmq.Context()
socket = context.socket(zmq.PULL)
socket.bind("tcp://127.0.0.1:5000")
while True:
# receive the message
msg = socket.recv()
print "Message Size is: {0} [MB]".format( len(msg) / (1000 * 1000) )
我错过了什么?如何保证消息一直发送不丢失?
以防万一,我使用的是 Ubuntu 10.04
32 位、Core Duo 机器和 2[GB] RAM。
注意:我使用 RabbitMQ
尝试了相同示例,一切正常——没有消息丢失。我很困惑,因为我经常听到对 zeroMQ
的赞美。为什么它在 RabbitMQ
成功的地方失败了?
最佳答案
问题在于,当程序退出时,套接字会立即关闭,并使用有效的 LINGER 为 0 进行垃圾收集(即,它会丢弃所有未发送的消息)。对于较大的消息,这是一个问题,因为发送它们所花费的时间比垃圾收集套接字所花费的时间要长。
您可以通过在程序退出之前放置一个 sleep(0.1)
来避免这种情况(以延迟套接字和上下文被垃圾收集)。
socket.setsockopt(zmq.LINGER, -1)
(这是默认设置)应该可以避免这个问题,但由于某种原因我没有时间去研究它。
关于Python ZeroMQ PUSH/PULL——丢失消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702187/