我试图在in 模式下使用python,每隔几秒钟发送大小为4 [MB]的消息.zeroMQPUSH / PULL
出于某种原因,虽然它看起来像是发送了所有消息,但它们中的一些似乎已经被服务器接收了.我在这里错过了什么?
这是客户端的代码 - 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"
Run Code Online (Sandbox Code Playgroud)
这是服务器的代码 - 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) )
Run Code Online (Sandbox Code Playgroud)
我错过了什么?如何保证邮件始终发送而不丢失?
如果它很重要,我使用的是Ubuntu 10.0432位,Core Duo机器,带有2 [GB] RAM.
注意:我尝试使用相同的示例RabbitMQ,一切正常 - 没有消息丢失.因为我经常听到赞美,我感到很困惑zeroMQ.为什么在RabbitMQ成功的地方失败了?
cwb*_*cwb 14
问题是,当程序退出时,套接字立即关闭,垃圾收集的有效LINGER为0(即它抛出任何未发送的消息).对于较大的消息,这是一个问题,因为它们需要更长的时间来发送,而不是对套接字进行垃圾回收.
您可以通过sleep(0.1)在程序退出之前放置一个(以延迟套接字和上下文被垃圾回收)来避免这种情况.
socket.setsockopt(zmq.LINGER, -1) (这是默认值)应该避免这个问题,但是由于某些原因我没有时间去调查.
| 归档时间: |
|
| 查看次数: |
7203 次 |
| 最近记录: |