树莓派温度传感器代码优化:实现并行读取文本文件
树莓派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
相关产品推荐
相关产品推荐

