on_message in paho mqtt 运行 在新线程中吗?

Does on_message in paho mqtt run in a new thread?

假设我已经订阅了某个主题,并且 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()

回调全部 运行 在客户端网络线程上。

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

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

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

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

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

  1. 他们只会在成功连接时获得 运行
  2. 网络线程 运行 处理发送订阅数据包和处理在您完成对所有主题的订阅之前可能到达的任何传入消息(如果数组长于 1)