首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >泛美卫生组织MQTT (Python) - loop_start()不起作用

泛美卫生组织MQTT (Python) - loop_start()不起作用
EN

Stack Overflow用户
提问于 2022-04-18 11:41:32
回答 2查看 1.6K关注 0票数 -1

我正在编写一个MQTT客户机,它只需连接到代理,发布一条消息,然后断开连接。下面是代码:

代码语言:javascript
运行
复制
def on_connect_v5(client, userdata, flags, rc, properties):
    print('connected')
    client.publish(topic, payload, 0)

def on_publish(client, userdata, mid):
    print(f'mid: {mid}')
    client.disconnect()

client = paho.Client(protocol=paho.MQTTv5)
client.on_connect = on_connect_v5
client.on_publish = on_publish
client.connect(host, port, 60)
client.loop_start()
# client.loop_forever()

问题是,当我使用loop_start()时,客户端似乎没有成功连接,但是loop_forever()可以工作。我对loop_start()函数做错什么了吗?使用它的正确方法是什么?

BTW:已经尝试使用paho.mqtt.publish模块,并且总是得到一个套接字超时。如果有人也能解释的话,我很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-18 12:02:26

区别在于loop_forever阻塞了程序。loop_start,只启动守护进程线程,但不阻塞。所以你的计划还在继续。在您显示的代码中,这意味着程序存在。

您可以在这里阅读更多内容:https://github.com/eclipse/paho.mqtt.python#network-loop

调用loop_start()一次,在connect*()之前或之后,在后台运行一个线程以自动调用循环()。这将释放主线程,用于其他可能被阻塞的工作。loop_forever()。这是网络循环的阻塞形式,在客户端调用disconnect()之前不会返回。它自动处理重新连接.

票数 2
EN

Stack Overflow用户

发布于 2022-05-16 09:36:13

您的主线程没有等待loop_start();因为它的守护进程线程。守护进程线程在完成其工作之前不会阻塞程序。当你的主线程完成它的工作时,你就会自杀。这也是杀死您的loop_start()线程。如果您的主线程具有无限循环或更长的循环,则您的loop_start()工作得非常完美。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71911331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档