You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:03:20