问题描述
我正在尝试了解订阅者和发布者缓冲区。如果我将订阅者缓冲区设置为 1000 并将发布者缓冲区设置为 1,我是否有可能丢失消息?谁能给我解释一下?
解决方法
是的,理论上使用这些设置您可能会丢失邮件,但实际情况视情况而定。
理论:纺线
在发布者和订阅者双方,都有所谓的微调线程负责处理回调(用于发布者端的消息发送和订阅者端的消息评估)。这些微调线程与主线程并行工作。如果消息从主线程到达的速度比它们由微调线程处理的速度快,则队列大小给出的消息数量将在开始丢弃最旧的消息之前被缓冲。因此,如果您以非常高的速率发布,发布者端的微调线程可能会丢弃较旧的消息,而如果订阅者端的回调函数执行时间过长,您的订阅者队列将开始丢弃消息。为了改善这一点,可以使用多线程微调器,其中增加微调器线程的数量并激活并发以更快地处理回调队列。阅读更多相关信息here。
练习:选择队列大小
您应该设置的发布者队列的队列大小 depends on which rate you publish and if you publish in bursts。如果您以突发或更高的频率(例如 > 10 Hz
)发布,1
的发布者队列大小将是不够的。在订阅者方面,更难给出建议,因为它还取决于回调处理信息所需的时间。
实际上也可以为队列设置值 0
,这会导致任意大的队列,但这可能会有问题,因为所需的内存可能会无限增长,至少直到您的计算机冻结为止。此外,大队列通常可能是不利的:如果您设置大队列并且回调需要很长时间来执行,您可能正在处理非常过时的数据,而队列越来越长。
替代沟通模式
如果你想保证信息确实被处理(例如实时或与安全相关的信息),ROS 主题可能是错误的选择。根据您的具体需求,其他两种通信方式 services
or actions
可能是替代方案。但是对于诸如与安全相关的实时数据的大量信息流之类的事情,ROS1 中没有完善的通信机制。