Python Paho MQTT: no se puede publicar inmediatamente en una función

Estoy implementando un progtwig que escucha un tema específico y reactjs a él cuando ESP8266 publica un nuevo mensaje. Cuando se recibe un nuevo mensaje de ESP8266, mi progtwig activará la callback y realizará una serie de tareas. Estoy publicando dos mensajes en mi función de callback al tema que el Arduino está escuchando. Sin embargo, los mensajes se publican solo después de que la función sale.

Gracias por todo su tiempo por adelantado.

He intentado usar el bucle (1) con un tiempo de espera de 1 segundo dentro de la función de callback. El progtwig publicará el mensaje inmediatamente, pero parece estar bloqueado en el bucle. ¿Alguien podrá darme algunos consejos sobre cómo puedo ejecutar cada función de publicación inmediatamente en mi función de callback, en lugar de cuando finalice la callback completa y volver al bucle principal antes ()?

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() 

    No puedes hacer esto, ya estás en el bucle de manejo de mensajes (eso es lo que se llama la función on_message) en el punto al que llamas publicación. Esto pondrá en cola los mensajes salientes que se manejarán en la próxima iteración del bucle, por eso se envían una vez que devuelve on_message.

    Se bloquea cuando llama al método de bucle porque el bucle ya se está ejecutando.

    No debería hacer llamadas de locking (suspensión) en la callback on_message de todos modos, si necesita hacer algo que lleve tiempo, inicie un segundo hilo para hacer esto. Al hacer esto, liberas el bucle de red para manejar las publicaciones salientes tan pronto como se hacen.