- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了很多关于类似主题的问题,但它们并没有帮助我解决我的问题。
使用:
即使在设置了 HWM 之后,ZMQ SUB 套接字中的接收方队列仍在无限增长。当订阅者比发布者慢时会发生这种情况。我能做些什么来防止它?
我在人机交互领域工作。我们有一个庞大的代码库来控制鼠标光标之类的东西。我想在几个模块中“打破它”,与 ZMQ 通信。它必须有尽可能少的延迟,但丢弃(丢失)消息并不那么重要。
另一个有趣的方面是可以在节点之间添加“ spy ”。因此 PUB/SUB 套接字似乎是最合适的。
像这样:
+----------+ +-----------+ +------------+
| | PUB | | PUB | |
| Input | +----+------> | Filter | +----+------> | Output |
| | | SUB | | | SUB | |
+----------+ v +-----------+ v +------------+
+-----+ +-----+
|Spy 1| |Spy 2|
+-----+ +-----+
一切正常,除了我们添加 spy 的时候。如果我们添加一个 spy 来做“繁重的事情”,比如使用 matplotlib 进行实时可视化,我们会注意到绘图中的延迟增加。 IE : 在上图中,过滤器和输出很快,没有看到延迟,但是在 Spy 2 上,运行 20 分钟后延迟可以达到 10 分钟 (!!)
看起来接收器上的队列无限增长。我们调查了 ZMQ 的高水位线 (HWM) 功能,将其设置为低位以丢弃旧消息,但没有任何改变。
+------------+ +-------------+
| | PUB | |
| sender | -------------> | receiver |
| | SUB| |
+------------+ +-------------+
接收者是一个慢速接收者(在第一张图中充当 spy )
发件人.py
import time
import zmq
ctx = zmq.Context()
sender = ctx.socket(zmq.PUB)
sender.setsockopt(zmq.SNDBUF, 256)
sender.set_hwm(10)
sender.bind('tcp://127.0.0.1:1500')
print(zmq.zmq_version()) ## 4.0.4
print(zmq.__version__) ## 14.3.1
print(sender.get_hwm()) ## 10
i = 0
while True:
mess = "{} {}".format(i, time.time())
sender.send_string(mess)
print("Send : {}".format(mess))
i+= 1
接收器.py:
import time
import zmq
ctx = zmq.Context()
front_end = ctx.socket(zmq.SUB)
front_end.set_hwm(1)
front_end.setsockopt(zmq.RCVBUF, 8)
front_end.setsockopt_string(zmq.SUBSCRIBE, '')
front_end.connect('tcp://127.0.0.1:1500')
print(zmq.zmq_version()) ## 4.0.4
print(zmq.__version__) ## 14.3.1
print(front_end.get_hwm()) ## 1
while True:
mess = front_end.recv_string()
i, t = mess.split(" ")
mess = "{} {}".format(i, time.time() - float(t))
print("received : {}".format(mess))
time.sleep(1) # slow
我认为这不是 ZMQ Pub/Sub 的正常行为。我尝试在接收器、订阅者和两者中设置 HWM,但没有任何改变。
编辑:
我认为我在解释我的问题时没有说清楚。我做了一个移动鼠标光标的实现。输入是在 ZMQ 中以 200Hz 发送的鼠标光标位置(带有 .sleep( 1.0/200 )
),完成了一些处理并更新了鼠标光标位置(我没有这个 sleep 在我的最小示例中)。
一切都很顺利,甚至在我启动 spy 时也是如此。然而, spy 的延迟时间越来越长(因为处理速度慢)。延迟不会出现在“管道”末尾的光标中。
我认为问题出在缓慢的订阅者排队消息。
在我的示例中,如果我们杀死发送者并让接收者存活,消息将继续显示,直到显示所有(?)提交的消息。
spy 正在绘制光标的位置以提供一些反馈,这样的延迟仍然很不方便......我只想获得发送的最后一条消息,这就是我尝试降低 HWM 的原因。
最佳答案
ZeroMQ 是一个强大的消息传递层。
就是说,检查它在原始 while True:
killer-loop
测量它。根据事实而非感觉进行设计。
start_CLK = time.time() # .SET _CLK
time.sleep( 0.001) # .NOP avoid DIV/0!
i = 0 # .SET CTR
while True: # .LOOP
sender.send_string( "{} {}".format( i, time.time() ) ) # .SND ZMQ-PUB
print i / ( time.time() - start_CLK ) # .GUI perf [msg/sec]
i+= 1 # .INC CTR
ZeroMQ 尽最大努力在方案中填充雪崩。
而且它非常擅长这一点。
你的 [Filter
] + [Spy1
] + [Output
] + [Spy2
] 流水线处理,端到端,都有
Input
]-sender或
这个队列链问题可以通过另一种架构设计来解决。
重新思考的事情:
sub-sample [Filter
].send() cadency(interleave factor is dependent to stability issues of the real -时间过程在你的控制下——可以是 1 毫秒(顺便说一句,O/S 计时器分辨率,所以使用 COTS O/S 计时器控件不可能进行量子物理实验 :o)),双向语音流 10 毫秒,50电视/GUI 流传输毫秒,键盘事件流等 300 毫秒)
在线 v/s 离线后处理/可视化(您注意到繁重的matplotlib
处理,您通常承担大约 800 - 1600 - 3600 毫秒的开销,即使是在简单的 2D 图形上——在决定 PUB/SUB 的更改之前测量-<proc1>-PUB/SUB-<proc2> 处理架构(您已经注意到,<spy2> 在增长 <proc2>-PUB 时会导致问题-馈送和发送开销)。
执行它们的线程数与本地主机内核数-- 从localhost ip可以看出,所有进程都驻留在同一个localhost上。加上每个使用的 ZMQ.Context 添加一个线程,加上查看 Python GIL 锁定开销,如果所有线程都被实例化来自同一个 Python 解释器......阻塞增长。阻挡伤害。更好的分布式架构可以提高这些性能方面。不过先复习一下[1]和[2]
n.b. 调用 20 分钟的处理管道延迟(实时系统 TimeDOMAIN 偏差)延迟是委婉的说法
关于python - ZMQ 延迟与 PUB-SUB(慢订阅者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25523231/
我在产品类别和子类别网站上工作,可以创建的子类别数量是无限的,这意味着我们可以自己拥有子类别的子类别。一切正常,我只是有一个问题:假设“PRODUCT 1”属于“SUB SUB CATEGORY 1”
我正在学习OCaml,并在代码2022的到来中努力工作。。但似乎读取input.txt文件会导致一些问题。。我收到了这个奇怪的错误,它来自于函数分数。尤其是那个叫得分手HD的表达。不过,当我手动将LI
我有一个奇怪的行为(对于 Python 程序员)子例程,它简化如下: use strict; use Data::Dumper; sub a { my @x; sub b { push @x,
在此页上 http://bit.ly/T3yJIH , drupal 的 Nice Menu 模块不能正确显示子子菜单。如果转到菜单中的第一项,然后转到子菜单中的第一项,就可以看到它。 (Facili
我需要在我的站点内创建一个子结构,我在其中拥有: 实际上我是通过 Javascript 来完成的(伪代码):SUB_Content.height = ParentDiv.height - Sub_He
我有一个与子菜单一起使用的 CSS 手册。我想知道如何向它添加子子菜单。例如,我将鼠标悬停在主菜单项上并弹出子菜单,然后我将鼠标悬停在子菜单项上并弹出另一个子菜单。这是我现在使用的 JS Fiddle
我有一个关于 navmenu 的问题我不能选择导航菜单的 sub sub ul,如果我会做什么它会影响 3.ul。这是一个 wordpress 菜单我没有机会使用类或菜单的 ID。提前感谢您的帮助。
我创建了一个带有 2 级子菜单的简单导航。我正在寻找“sub sub”选项以显示在其父项的右侧而不是下方。对于 CSS 的任何帮助,我将不胜感激。下面是 html 和 css 以及 JS fiddle
我对 VBA、这个论坛和编程很陌生。我有一个工作表,我已经设法根据我的要求谷歌并调整某些代码行。 我的问题是我总共有三个潜艇,必须逐步运行每个 VBA 脚本。我希望将所有三个 VBA 脚本合二为一。
我使用 sub 调用作为另一个 sub 的参数。示例代码: test(isInString(), 'second parameter', 'third parameter'); sub test {
我想使用 HTML ui->FresBox->setText("fres"); 但它在 QCheckbox 中不起作用。如果您使用标签,它会很好用。有什么不同以及如何在 QCheckbox 中使用 H
我没有遇到这个问题,但在处理相关问题时想到了这个问题。让我们: logging = 'something' # bad naming decision import logging as lg
我正在查看 Redis pubsub,消费者是 2-4 节点自动缩放组的一部分(HA 原因) 也许我遗漏了一些明显的东西,但是 Redis pubsub 中是否有某种机制可以管理订阅者/消费者收到的重
对你们来说应该是一个快速和简单的,为什么这不起作用? 代码限制用户只能在文本框中输入文本。 它工作正常,但我有大约 50 个文本框,所以会更干净,更容易调用。 但是,这样做,限制不再起作用 Priva
(编辑)TL; DR :我的问题是,尽管Win32 API定义的是真实的整数常量(如平台SDK header 中一样),而Win32 Perl包装器将它们定义为subs。从而引起一线解析的误解。 在单
我有一个使用 Jersey 实现 REST API 的 Web 应用程序。 Web 容器 id Tomcat 以下是 API 的摘要: /rest/patients 获取患者元数据列表。 /rest/
我与 Czech 一起工作Python 3.4 中的重音文本。 调用 re.sub()用正则表达式对重音句子进行替换效果很好,但使用用 re.compile() 编译的正则表达式然后调用regex.s
对于我的一个新项目,我必须创建一个包含主类别、子类别和子子类别的类别页面。例如; 互联网 互联网 > 发展 互联网 > 开发 > 移动应用 在此类别中,您可以找到有关这些内容的网站。我必须为每个网站提
表1 - 客户数据 c_id(整数) 名称(varchar) 表2 - account_data a_id(整数) c_id (int) -> 使用customer_data。c_id plan_id
我有一些位图文件(jpeg、png、...),我想编写一个 C++ 程序,将这些位图文件连接到 pes 流(mpeg-2 格式),然后创建一个子文件(.sub/. idx:vobsub 字幕文件)。
我是一名优秀的程序员,十分优秀!