Ciao a tutti sto scrivendo un piccolo programma e vorrei usare asyncio ed mqtt, in pratica ho una funzione asincrona che aspetta che un asyncio.Event() venga settato per fare il suo lavoro, e il set dell' event dovrei prenderlo dalla funzione di callback on_message di mqtt, ho scritto una funzione per far partire il loop mqtt e la funzione che deve svolgere il lavoro, le faccio partire entrambe usando asyncio.gather alla ricezione del messaggio facendo una print su "event" vedo che passa da unset a set, ma nella funzione asincrona resta sempre in attesa.
questo è il codice che sto usando per capire come fare
import asyncio
import paho.mqtt.client as mqtt
msg_test = ""
event = asyncio.Event()
def event_set():
event.set()
def on_message(client, userdata, msg):
global msg_test
print("on_message",event)
print(msg.topic+" "+str(msg.payload.decode()))
event_set()
msg_test = str(msg.payload.decode())
def on_connect(client, userdata, flags, rc):
if rc==0:
client.connected_flag=True
print("connected OK Returned code=",rc)
client.subscribe("test")
else:
print("Bad connection Returned code= ",rc)
async def print_msg():
print("sono in async")
global msg_test
while True:
print("print_msg",event)
await event.wait()
print("async def", msg_test)
await asyncio.sleep(5)
event.clear()
async def mqtt_connect():
client = mqtt.Client()
client.on_connect= on_connect
client.on_message = on_message
client.username_pw_set("testuser", password="testuser")
client.connect_async("localhost", 1883)
await asyncio.sleep(2)
client.loop_start()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
coro = asyncio.gather(mqtt_connect(), print_msg())
event.set()
loop.run_forever()
volevo capire se è una cosa possibile oppure proprio non si può fare, nel caso esiste un altro modo per farlo sfruttando gli eventi di asyncio, al momento sto usando un'altro script che va a leggere sempre lo stato di una variabile che cambia raramente, quindi volevo usare mqtt.
Spero di essermi spiegato bene.
Grazie