Python ZeroMQ PUSH/PULL——丢失消息?

标签 python zeromq

我正在尝试在 PUSH/PULL 模式下将 pythonzeroMQ 一起使用,发送大小为 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/

相关文章:

c# - ZMQ消息传递特定端点

python - 如何检查一个句子是否正确(Python中的简单语法检查)?

python - 将 Json 文件读取为 Pandas Dataframe 错误

c - C 语言中的 Zeromq pub/sub 示例 (libzmq)

client-server - ZeroMQ (C) : Basic request-reply issue

python - ZMQ软件和语言绑定(bind)的区别

c# - 如何使用程序包管理器控制台为控制台 C# 应用程序安装 clrzmq?

python - 使用 Python 请求 'bridge' 文件而不加载到内存中?

python - setup.py build 不起作用,但开发可以

python - 删除连续的字母重复项