Python Paho MQTT:无法在函数中立即发布

Python Paho MQTT:无法在函数中立即发布,python,mqtt,paho,Python,Mqtt,Paho,我正在执行一个程序,该程序可以收听特定主题,并在我的ESP8266发布新消息时作出反应。当从ESP8266接收到新消息时,我的程序将触发回调并执行一组任务。我在回调函数中将两条消息发布回Arduino正在侦听的主题。但是,只有在函数退出后才会发布消息 提前感谢您花了这么多时间 我尝试在回调函数中使用超时1秒的循环(1)。程序将立即发布消息,但它似乎陷入了循环。有人能给我一些建议吗?我如何在回调函数中立即执行每个发布函数,而不是在整个回调完成并返回到主循环_forever()时执行 不能这样做,在

我正在执行一个程序,该程序可以收听特定主题,并在我的ESP8266发布新消息时作出反应。当从ESP8266接收到新消息时,我的程序将触发回调并执行一组任务。我在回调函数中将两条消息发布回Arduino正在侦听的主题。但是,只有在函数退出后才会发布消息

提前感谢您花了这么多时间

我尝试在回调函数中使用超时1秒的循环(1)。程序将立即发布消息,但它似乎陷入了循环。有人能给我一些建议吗?我如何在回调函数中立即执行每个发布函数,而不是在整个回调完成并返回到主循环_forever()时执行


不能这样做,在调用publish时,您已经处于消息处理循环(这就是所谓的on_消息函数)中。这将对要由循环的下一次迭代处理的传出消息进行排队,这就是为什么它们在消息返回时发送一次

调用循环方法时它将挂起,因为循环已在运行


无论如何,您不应该在on_消息回调中进行阻塞(sleep)调用,如果您需要做需要时间的事情,请启动第二个线程来执行这些操作。通过这样做,您可以释放网络循环,以便在传出发布后立即处理它们。

您也不应该在回调中调用loop()。感谢您的回复。我真的很感激!我想我有点搞不清楚你回拨邮件的目的。
import paho.mqtt.client as mqtt
import subprocess
import time

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))

    # Subscribing in on_connect() means that if we lose the connection and
    # reconnect then subscriptions will be renewed.
    client.subscribe("ESP8266")

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    client.publish("cooking", '4')
    client.loop(1)
    print("Busy status published back to ESP8266")
    time.sleep(5)
    print("Starting playback.")
    client.publish("cooking", '3')
    client.loop(1)
    print("Free status published published back to ESP8266")
    time.sleep(5)
    print("End of playback.")


client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("192.168.1.9", 1883, 60)
#client.loop_start()

# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.
client.loop_forever()