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

树莓派温度传感器代码优化:实现并行读取文本文件

树莓派DS18B20传感器并行读取优化方案

为什么需要并行读取?

你现在的代码是按顺序逐个读取传感器文件,每个文件IO操作都会阻塞程序——尤其是传感器数量多的时候,等待时间会累加,整体效率很低。用多线程或多进程确实能有效利用IO等待的空闲时间,把串行的读取变成并行,大幅提升整体读取速度。

多线程实现方案(更推荐)

传感器读取属于IO密集型任务,多线程在这种场景下比多进程更高效(进程的创建和运行开销要大得多)。我们可以把重复的读取逻辑封装成通用函数,再用threading模块实现并行执行:

示例代码

import threading

# 通用传感器读取函数,适配任意传感器路径
def read_single_sensor(sensor_path, result_store, sensor_index):
    try:
        with open(sensor_path, 'r') as f:
            lines = f.readlines()
        result_store[sensor_index] = lines[1]
    except Exception as e:
        result_store[sensor_index] = f"读取失败: {str(e)}"

# 假设这是你的传感器路径列表
sensorfolder = [
    "/sys/bus/w1/devices/28-xxxxxx/w1_slave",
    "/sys/bus/w1/devices/28-yyyyyy/w1_slave",
    "/sys/bus/w1/devices/28-zzzzzz/w1_slave"
]

def parallel_read_all_sensors():
    # 用字典保存线程结果,每个线程只操作自己的索引键,线程安全
    sensor_results = {}
    thread_list = []

    # 为每个传感器创建一个读取线程
    for idx, path in enumerate(sensorfolder):
        thread = threading.Thread(
            target=read_single_sensor,
            args=(path, sensor_results, idx)
        )
        thread_list.append(thread)
        thread.start()

    # 等待所有线程完成读取
    for thread in thread_list:
        thread.join()

    # 按传感器顺序整理结果返回
    return [sensor_results[i] for i in range(len(sensorfolder))]

# 调用示例
if __name__ == "__main__":
    data = parallel_read_all_sensors()
    print("传感器1数据:", data[0])
    print("传感器2数据:", data[1])
    print("传感器3数据:", data[2])

多进程实现方案

如果后续你需要对读取到的数据做大量CPU密集型计算,多进程可以考虑,但纯IO场景下优势不大。用multiprocessing模块实现的示例如下:

示例代码

from multiprocessing import Pool

def read_single_sensor(sensor_path):
    try:
        with open(sensor_path, 'r') as f:
            lines = f.readlines()
        return lines[1]
    except Exception as e:
        return f"读取失败: {str(e)}"

sensorfolder = [
    "/sys/bus/w1/devices/28-xxxxxx/w1_slave",
    "/sys/bus/w1/devices/28-yyyyyy/w1_slave",
    "/sys/bus/w1/devices/28-zzzzzz/w1_slave"
]

def parallel_read_all_sensors():
    # 创建进程池,进程数建议不超过CPU核心数的2倍
    with Pool(processes=min(len(sensorfolder), 4)) as pool:
        results = pool.map(read_single_sensor, sensorfolder)
    return results

# 调用示例
if __name__ == "__main__":
    data = parallel_read_all_sensors()
    print("所有传感器数据:", data)

几个实用注意事项

  • 用with语句打开文件,能自动处理文件关闭,避免资源泄漏。
  • 多线程中用字典存结果是安全的,因为每个线程只操作自己的索引键,不会出现资源竞争问题。
  • 多进程的Pool.map方法会自动按输入顺序返回结果,和sensorfolder的顺序完全对应。
  • 如果传感器数量特别多,别创建过多的线程/进程——建议限制线程数为CPU核心数的2倍,进程数不超过CPU核心数,避免占用过多系统资源。

内容的提问来源于stack exchange,提问作者Kod-ove

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:48:52