gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:16:22 24 4
gpt4 key购买 nike

假设我已经订阅了某个主题,并且 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() 方法,那么这会在后台启动一个新线程来运行网络循环和所有回调。

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

附:对于您发布的代码,您实际上应该移动 for 循环和订阅 on_connect 回调的调用,以便:

  1. 它们仅在成功连接时运行
  2. 网络线程正在运行,以处理发送订阅数据包以及处理在完成所有主题订阅之前可能到达的任何传入消息(如果数组长度超过 1)

关于python - paho mqtt 中的 on_message 是否在新线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com