作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我已经订阅了某个主题,并且 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
回调的调用,以便:
关于python - paho mqtt 中的 on_message 是否在新线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925734/
嘿。本周的一个教程,其中一个问题要求通过使用其他函数 formatLine 和 formatList 创建一个函数 formatLines,以格式化行列表。 我的代码是这样的; type Line =
我是一名优秀的程序员,十分优秀!