在MQTT客户端中连续运行代码部分的解决方案?

时间:2019-01-03 21:01:18

标签: python python-3.x mqtt paho

我正在尝试通过mqtt连接向我发送消息,然后对收件箱中收集到的消息执行任务。问题是,当我运行代码时,尚未收到消息,并且代码中应根据消息中的信息起作用的部分没有再次运行。

我曾考虑过使用while True:循环,但是根本无法访问mqtt脚本。这是行不通的。

这可能是一个非常基本的问题,但是如何实现连续运行mqtt客户端并在以后的某个时刻处理收集到的消息呢?

import paho.mqtt.client as client

hostname = 'test.mosquitto.org'
topic = "personal/topic"

# receiving the data
inbox = []    

def on_message(client, userdata, msg):
    msg = msg.payload.decode()
    inbox.append(msg)
    print("Received Message No. %s:    %s" % (len(inbox), msg))    

def on_connect(client, userdata, flags, rc):
    print("Connection returned result: " + str(rc))
    client.subscribe(topic)

# this is where I want to perform a task on the message
y = []
X = []
for msg in inbox:
    label, data = msg.split(': ')
    data = data.split(', ')
    y.append(label)
    X.append(data)

# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_forever()

这是在脚本末尾使用client.loop_start()的构造(与@hardillb的答案有关):

# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_start()

while True:
    y = []
    X = []
    for msg in inbox:
        label, data = msg.split(': ')
        data = data.split(', ')
        y.append(label)
        X.append(data)

client.disconnect()
client.loop_stop()

1 个答案:

答案 0 :(得分:1)

paho客户端可以使用client.loop_start()函数在单独的线程上启动它的网络工作者。

此后,您可以开始自己的处理循环,但是on_message回调函数将在客户端的网络工作线程上运行,因此,如果要将排队的传入消息排队以便以后处理,则需要确保当您存储消息时,它是以线程安全的方式完成的。