- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在理解 ZeroMQ 高水位线 (HWM) 队列的工作原理时遇到一些问题。
我在下面附上了两个脚本,它们重现了以下内容。
我得到的结果是拉取器能够成功接收(打印)所有消息。此外,推送器似乎几乎立即完成执行。根据ZMQ official documentation我期望的是推送器不会在拉动器醒来之前完成执行,因为由于达到 HWM 而在第二次 send(...)
调用时被阻止。我还尝试在每次 send(...)
调用之间添加 0.001 秒的 sleep ,结果相同。
所以,我的问题是:
send(...)
时没有阻塞? 脚本:
import zmq
context = zmq.Context()
push_socket = context.socket(zmq.PUSH)
push_socket.setsockopt(zmq.SNDHWM, 1)
push_socket.setsockopt(zmq.RCVHWM, 1)
push_socket.bind("tcp://127.0.0.1:5557")
print(push_socket.get_hwm()) # Prints 1
print('Sending all messages')
for i in range(2200):
push_socket.send(str(i).encode('ascii'))
print('Finished execution...')
import zmq
import time
context = zmq.Context()
pull_socket = context.socket(zmq.PULL)
pull_socket.setsockopt(zmq.RCVHWM, 1)
pull_socket.setsockopt(zmq.SNDHWM, 1)
pull_socket.connect("tcp://127.0.0.1:5557")
print(pull_socket.get_hwm()) # Prints 1
print('Connected, but not receiving yet... (Sleep 4s)')
time.sleep(4)
print('Receiving everything now!')
rec = ''
for i in range(2200):
rec += '{} '.format(pull_socket.recv().decode('ascii'))
print(rec) # Prints `0 1 2 ... 2198 2199 `
为了重现我的测试用例,打开两个终端并在一个终端中启动第一个 puller.py,然后快速(4 秒窗口)在另一个终端中启动 pusher.py。
最佳答案
这里至少涉及到4个buffer:zmq send buffer,OS write tcp buffer,OS read tcp buffer,zmq recv buffer。
zmq io 线程在消息成功写入操作系统 tcp 写入缓冲区后将其标记为“已发送”。这些消息现在被视为“正在传输”。
然后网络堆栈负责将尽可能多的数据传输到其他进程的匹配操作系统接收缓冲区中,最后,接收 zmq io 线程一次最多从该缓冲区读取 HWM 消息到 ZMQ 接收队列。
默认情况下,操作系统缓冲区通常在 10-100kb 左右,并且在 ZMQ 甚至注意到另一方没有使用任何消息之前,这两个缓冲区都可能被“传输中”的消息完全填满。出于性能原因,这些缓冲区是必需的 - 您不能只是摆脱它们。
您的问题的解决方案可能涉及请求/代表套接字和显式应用程序级确认,即指南中的懒惰盗版模式。
关于python - 理解ZMQ的HWM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42948798/
我希望这个程序中的线程以锁步方式工作。但是,发送方在等待接收方 catch 之前发送了约 60000 条消息。我对 HWM 有什么误解? 如果我不启动接收线程,那么发送方会在尝试发送第二条消息时阻塞。
我发现了一个类似的问题,ZeroMQ: HWM on PUSH does not work ,但它无法解决我的问题。 我想控制推送套接字排队的消息数,但它不起作用,仍然排队 1000 条消息。 所以我
我正在尝试编写一个服务器/客户端脚本,其中包含一个用于执行任务的服务器和多个执行它的工作人员。问题是我的呼吸机有太多任务,它会在心跳中填满内存。我试图在绑定(bind)之前设置 HWM,但没有成功。一
我在 Linux 中使用 ZeroMQ(更具体地说是 CZMQ)为 IPC 实现了一个消息总线。 Here是我已经实现的。 我的问题是,我怎么知道 send 在发布者缓冲区已满时丢弃了消息? 在我的简
我是一名优秀的程序员,十分优秀!