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

如何在Python的paho.mqtt中打印单条数据而非持续循环输出

解决MQTT订阅脚本仅接收一条消息后终止的问题

原脚本使用client.loop_forever()会持续运行并输出所有收到的消息,换成client.loop_start()后主线程直接退出,导致未收到消息就终止。以下是两种可行的修改方案:

方案1:基于loop_forever()的简化实现

在消息回调中处理完数据后直接断开连接,loop_forever()会在客户端断开后自动终止运行:

import random
import json
from paho.mqtt import client as mqtt_client

broker = '192.168.62.24'
port = 1883
topic = "tvekrani"
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = 'admin'
password = 'admin'

def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc != 0:
            print(f"连接失败,返回码: {rc}")

    client = mqtt_client.Client(client_id)
    # client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        data = msg.payload.decode()
        veri = json.loads(data)
        print(veri["speakers"])
        # 处理完单条消息后断开MQTT连接
        client.disconnect()
    
    client.subscribe(topic)
    client.on_message = on_message

def run():
    client = connect_mqtt()
    subscribe(client)
    # loop_forever会在client.disconnect()后自动终止循环
    client.loop_forever()

if __name__ == '__main__':
    run()

方案2:基于loop_start()的后台线程实现

启动后台线程处理MQTT事件,主线程等待客户端断开后再终止:

import random
import json
import time
from paho.mqtt import client as mqtt_client

broker = '192.168.62.24'
port = 1883
topic = "tvekrani"
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = 'admin'
password = 'admin'

def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc != 0:
            print(f"连接失败,返回码: {rc}")

    client = mqtt_client.Client(client_id)
    # client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        data = msg.payload.decode()
        veri = json.loads(data)
        print(veri["speakers"])
        # 处理完单条消息后断开MQTT连接
        client.disconnect()
    
    client.subscribe(topic)
    client.on_message = on_message

def run():
    client = connect_mqtt()
    subscribe(client)
    
    # 启动后台线程处理MQTT网络事件
    client.loop_start()
    
    # 主线程等待,直到客户端断开连接
    while client.is_connected():
        time.sleep(0.1)
    
    # 停止后台循环线程
    client.loop_stop()

if __name__ == '__main__':
    run()

两种方案核心逻辑一致:在收到第一条消息并处理完成后,主动断开MQTT连接,触发脚本终止运行。

内容的提问来源于stack exchange,提问作者ismailk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:49:57