如何在树莓派上用Multiprocessing实现传感器数据接收与网站发送并行?
用Multiprocessing实现传感器数据接收与上传的并发执行
完全可以通过Python的multiprocessing库实现你的需求,核心是用两个独立进程分别处理数据接收和服务器上传,再通过进程安全的队列作为缓存,解决通信延迟导致的数据丢失问题。
修正后的完整代码
import multiprocessing import time # 导入nrf24L01相关库,比如nrf24或者pyRF24,根据你的实际使用库调整 # import nrf24 def receive_data(data_queue): # 初始化nrf24L01接收器 # 示例初始化(根据你的硬件配置调整): # radio = nrf24.NRF24() # radio.begin(0, 0, 25, 24) # CE, CSN, SPI speed, SPI bus # radio.setPayloadSize(32) # radio.openReadingPipe(1, b"\x01\x02\x03\x04\x05") # radio.startListening() sample_interval = 1 / 2000 # 2kHz采样率,每次间隔0.5ms while True: # 读取nrf24L01的数据 # if radio.available(): # received_data = [] # radio.read(received_data, radio.getPayloadSize()) # # 将数据转为可用格式,比如字符串/数值 # data = b"".join(received_data).decode().strip() # data_queue.put(data) # 放入队列缓存 # 模拟数据接收(实际使用时替换为真实读取逻辑) data = f"Sensor data {time.time()}" data_queue.put(data) print(f"Data received: {data}") # 控制采样率,确保2kHz固定频率 time.sleep(sample_interval) def send_to_server(data_queue): # 初始化服务器上传相关配置,比如requests会话 # import requests # session = requests.Session() # server_url = "https://your-server-url/upload" while True: # 从队列取出数据,队列为空时阻塞等待,避免空轮询 data = data_queue.get() # 上传数据到服务器(实际使用时替换为真实上传逻辑) # try: # response = session.post(server_url, data={"sensor_data": data}) # response.raise_for_status() # print(f"Data sent successfully: {data}") # except Exception as e: # print(f"Failed to send data: {e}, requeueing data...") # data_queue.put(data) # 上传失败时重新放回队列 # 模拟上传(实际使用时替换为真实上传逻辑) print(f"Data sent to server: {data}") # 模拟服务器延迟 time.sleep(0.1) if __name__ == '__main__': # 创建进程安全的队列,作为数据缓存 data_queue = multiprocessing.Queue(maxsize=1000) # 设置队列最大容量,防止内存溢出 # 创建两个进程 receive_process = multiprocessing.Process(target=receive_data, args=(data_queue,)) send_process = multiprocessing.Process(target=send_to_server, args=(data_queue,)) # 启动进程 receive_process.start() send_process.start() # 等待子进程结束(因为子进程是无限循环,主进程会一直阻塞在这里) receive_process.join() send_process.join()
关键要点说明
- 进程间通信:使用
multiprocessing.Queue作为缓存,它是进程安全的,自带锁机制,不会出现多个进程同时读写导致的数据混乱问题。设置maxsize可以限制队列最大长度,防止接收速度远快于上传速度时占用过多内存。 - 无限循环执行:两个子进程内部都用
while True实现不间断运行,主进程通过join()等待子进程,确保主进程不会提前退出(主进程退出会导致所有子进程终止)。 - 采样率控制:接收进程中用
time.sleep(1/2000)保证2kHz的固定采样率,实际使用时可以根据nrf24L01的接收API调整,确保数据读取频率符合要求。 - 上传容错:如果服务器上传失败,可以将数据重新放回队列,避免数据丢失(代码中已注释该逻辑,可根据实际需求启用)。
原代码问题修正
- 你原代码中重复给
p1赋值,导致接收进程没有被创建,需要分别创建两个进程对象。 - 进程需要调用
start()方法才能启动,且要传入队列作为参数实现数据共享。 - 主进程不需要自己的
while True循环,用join()等待子进程即可,否则会额外占用资源。
内容的提问来源于stack exchange,提问作者Emmanuel Andrade
相关产品推荐
相关产品推荐

