Python中能否用变量缓存Lidar数据同时运行计算脚本?
解决方案:用多线程/多进程实现传感器数据监听与计算分离
核心思路
不用拆成两个独立文件,直接在单个脚本里通过多线程(或多进程)把「传感器数据读取」和「数据计算」拆成两个并行任务:
- 一个线程专门负责持续监听Lidar数据,将最新数据存入线程安全的缓存变量
- 另一个线程从缓存中取数据执行计算,两者互不阻塞
具体实现示例
1. 线程安全的缓存类
用threading.Lock避免多线程读写缓存时出现数据混乱:
import threading class LidarCache: def __init__(self): self._data = None self._lock = threading.Lock() def update(self, new_data): with self._lock: self._data = new_data def get(self): with self._lock: return self._data.copy() # 返回副本防止计算过程中数据被修改
2. 传感器监听线程
专门负责持续读取Lidar数据并更新缓存:
import time def lidar_listener(cache): while True: # 替换为你的实际传感器读取逻辑 raw_lidar_data = read_lidar_sensor() # 调用传感器API获取数据 cache.update(raw_lidar_data) time.sleep(0.01) # 根据传感器采样频率调整,避免过度占用CPU
3. 数据计算线程
从缓存取数据执行定位计算,不会阻塞监听流程:
def position_calculator(cache): while True: current_data = cache.get() if current_data is not None: # 替换为你的船舶定位计算逻辑 ship_coords = calculate_ship_position(current_data) print(f"当前船舶位置:{ship_coords}") time.sleep(0.1) # 计算频率按需调整
4. 主程序启动并行任务
if __name__ == "__main__": cache = LidarCache() # 启动监听线程,设置为守护线程随主程序退出 listener_thread = threading.Thread(target=lidar_listener, args=(cache,), daemon=True) listener_thread.start() # 启动计算线程 calculator_thread = threading.Thread(target=position_calculator, args=(cache,), daemon=True) calculator_thread.start() # 保持主程序运行 while True: time.sleep(1)
优势对比(相较于TXT文件方案)
- 无磁盘IO开销,数据传递速度更快
- 无需处理文件读写异常(如文件占用、写入不完整)
- 单个脚本管理,部署和调试更便捷
额外提示
如果你的定位计算是CPU密集型任务,建议用多进程替代多线程(Python的GIL会限制多线程的CPU利用率),缓存可改用multiprocessing.Queue或Manager管理的共享变量;另外可限制缓存存储的最新数据帧数,避免内存占用过高。
内容的提问来源于stack exchange,提问作者Kevin Verhagen
相关产品推荐
相关产品推荐

