ROS1节点到底有几个线程

阅读ROS1 noetic源码ros_comm,得到如下结论:

一、rospy

python版本的ROS1节点会给每个subscriber,每个timer新建一个线程。所以python ROS节点根本不需要rospy.spin()来执行回调,因为subscriber和timer的回调都在各自的线程里运行,rospy.spin()的作用只是阻塞主线程保证程序不退出罢了。

但要注意多线程并不意味着并发,python由于全局解释锁(GIL)的存在,不管其进程中开了几条“线程”,仍然实际只占用了系统的一条线程,不会利用cpu的多核并发性能。所以python的线程在并发角度其实时假线程。要在一个程序内实现真并发,可以用multi-process库,实际上也是开多个进程。

rospy由于每个subsciber和timer的回调都在各自单独的线程中执行,所以并不是线程安全的。也就是说你需要手动为不同回调函数中同时用到的变量进行加锁等操作来保证线程安全。好在有一些python的原子操作是线程安全的,比如读写单一基本变量(int, float, string)。

参考:Threads in ROS and Python

二、roscpp

c++版本的ROS1节点要复杂得多。roscpp建立了一个global callback queue回调队列,所有的subscriber和timer都将自己的回调add到这个callba

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值