为什么“ time.sleep”不延迟MQTT发布消息?

时间:2019-08-27 23:08:17

标签: python python-2.7 mqtt delay

Python 2.7

我要发布3次,间隔为3秒。

所以我尝试使用time.sleep(3),然后发布。

我的代码如下:

for i in range(3):
    print(i)
    mqttc.publish("test", "hello")
    time.sleep(3)

结果应为:

0
(Publish)
(delay 3 sec)
1
(Publish)
(delay 3 sec)
2
(Publish)
(delay 3 sec)

但实际结果是:

0
(delay 3 sec)
1
(delay 3 sec)
2
(delay 3 sec)
(Publish)
(Publish)
(Publish)

真正的结果是从MQTT.fx中发现的,并且Python订阅了。

“延迟”通常可以用于“打印”,但不能“发布”,

我不明白为什么发布是连续的...

1 个答案:

答案 0 :(得分:2)

这非常简单:MQTT需要运行其事件循环以处理网络通信。通过使线程处于休眠状态,您可以有效地使控制权脱离MQTT,并使它无法做任何有用的事情。

代替阻塞线程,您应该让MQTT的事件循环处理计时:

for i in range(3):
    print(i)
    mqttc.publish("test", "hello")
    mqttc.loop(timeout=3.0)

您还可以使用loop_start()loop_stop()在不同的线程上运行后台事件循环,但是线程并不是便宜的资源,因此,如果您浪费整个线程实际上不执行任何操作,最好让该线程有用。使用线程的经验法则是,如果一个线程遇到一个问题,而两个线程遇到两个或更多个问题(它们往往会成倍增加)。