paho mqtt中的on_message是否在新线程中运行?

时间:2019-09-13 14:41:06

标签: python mqtt paho

让我们假设我已经订阅了某个主题,而mosquitto服务器正在不断发布有关该主题的消息。

从mosquitto经纪人收到新消息时,如何调用on_message方法?它是在主线程上运行从而阻塞它,并且仅在处理当前消息时才处理下一条消息吗?还是在每次收到新消息时使用on_message方法生成一个新线程?

import paho.mqtt.client as mqtt

def on_message(client, userdata, message):
    print message.payload
    return True

topics = ["topic1",]
client = mqtt.Client("testclient",protocol=mqtt.MQTTv31,clean_session=True)
client.on_message=on_message
client.connect("127.0.0.1", 1883, 60)
for tpc in topics:
    client.subscribe(tpc,0)
client.loop_forever()

1 个答案:

答案 0 :(得分:1)

所有回调都在客户端网络线程上运行。

那是什么取决于您如何“启动”网络线程。

如果您使用client.loop_forever()方法,那么它将使用当前线程来运行客户端的网络线程,并因此阻塞该调用。

如果您使用client.loop_start()方法,那么它将在后台启动一个新线程来运行网络循环和所有回调。

所有回调都会阻塞网络线程的执行,这就是为什么您不应该在回调中直接运行长时间运行或阻塞任务的原因。如果您需要长时间运行处理程序,则应将传入消息排队,并让另一个线程(或线程池)处理它。

p.s。对于您发布的代码,您应该真正将它们移至for循环和用于订阅on_connect回调的调用,以便:

  1. 它们只能在成功的连接上运行
  2. 网络线程正在运行,以处理用于订阅的数据包,并处理在您完成所有主题(如果数组长于1)之前可能到达的所有传入消息