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

如何在树莓派上用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:02