message-queue - 将 ROS 发布者或订阅者的队列大小设置为较大值的原因
解决方案
来自 ROS 文档(http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber):
消息发布者(生产者):“advertise() 的第二个参数是用于发布消息的消息队列的大小。如果消息发布的速度比我们可以发送的快,这里的数字指定在抛出之前要缓冲多少消息有些远。”
消息订阅者:“subscribe() 函数的第二个参数是消息队列的大小。如果消息到达的速度快于它们的处理速度,则这是在开始丢弃最旧的消息之前将缓冲的消息数那些。”
可能的解释:考虑消费者-生产者问题。
你不能保证你会以它们到达的速度消费消息。因此,您创建了一个队列,该队列在消息来自发送者(例如某些传感器)时被填充。坏情况:如果您的程序在某些其他部分出现延迟,并且您无法以消息到达的速度读取消息,则队列会增加。好案例:一旦您的其他处理负载减少,您就可以更快地读取队列并开始减少它。如果您有空闲时间,您最终会将队列大小减少到零。
因此,对于您的问题,如果您将队列大小发送到较大的值,您可以保证不会丢失消息。在一个简单的示例中,您没有内存限制,因此您可以做任何您想做的事情,例如使用许多 GBytes 的 RAM 来创建一个大队列并保证始终有效。或者,如果您创建一个玩具示例来解释您不希望程序因其他原因而崩溃的概念。
一个真实的例子可以是服务员和厨房洗碗的场景。假设顾客结束用餐,服务员把他们的脏盘子拿去厨房洗。他放了一张桌子。只要洗碗机可以,他就去餐桌拿盘子,然后拿去洗。在正常操作中,表格永远不会被填满。但是,如果其他人给洗碗工另一个任务,桌子就会开始满了。直到一段时间,服务员都不能再放盘子,把桌子弄脏了(系统问题)。但是如果那里的桌子人为地很大(比如说 1000 平方米),即使洗碗机很忙,服务员也可能会完成它的工作,考虑到一段时间后他就能回来洗碗了。
好的,答案很长,但理解队列可能会有所帮助。
推荐阅读
- facebook-authentication - VueJS Facebook 身份验证`withCrednetials` 无法用于生产(Heroku)
- asp.net - ASP.NET Core:如何使用“用户名”而不是“电子邮件”登录?
- javascript - read.ts(6133) 模块 '"../../../node_modules/rxjs/observable/combineLatest"' 没有导出的成员 'combineLatest'.ts(2305)
- laravel - Laravel:如何进行数学计算
- c# - 版本 3 机器人代码中的 LUIS 意图方法应如何在机器人框架版本 4 中编写?
- nestjs - Passport JwtStrategy 从未在 Nestjs 中执行
- python-3.x - 无法在 numpy ndarray 中将字符串转换为浮点数
- angular - 如何将 Ionic 4 与核心提供程序模块以及延迟加载的功能模块一起使用
- prolog - 判断一个数是否是另一个数的倍数
- laravel - Laravel-重定向甚至经过身份验证的用户登录