2017-09-07 3 views
0

Ich möchte einen Paho MQTT Python Service implementieren, der immer läuft, Nachrichten empfängt und sendet. Wenn ein Fehler auftritt, sollte er neu gestartet werden.Wie man mehrere Paho MQTT Clients als Dienst/Daemon laufen lässt

Ich habe zwei Klassen implementiert, die jeweils eine Thread-Netzwerkschleife mit pahos loop_start() starten. Diese Klassen haben dann einige Callback-Funktionen, die andere Klassen aufrufen und so weiter.

Für jetzt habe ich ein einfaches Python-Skript, das die Klassen aufruft und Schleifen:

from one import one 
from two import two 

import time 

one() 
two() 

while True: 
    if one.is_alive(): 
     print("one is still alive") 
    else: 
     print("one died - do something!") 
    time.sleep(1) 

Und hier meine Klasse „Eins“:

import paho.mqtt.client as mqtt 
import json 

class one(): 
    def __init__(self): 

     self.__client = mqtt.Client(client_id = "one") 
     self.__client.connect("localhost", 1883) 
     self.__client.subscribe("one") 
     self.__client.on_connect = self.__on_connect 
     self.__client.on_message = self.__on_message 
     self.__client.on_disconnect = self.__on_disconnect 
     self.__client.loop_start() 

    def __on_connect(self, client, userdata, flags, rc): 
     print("one: on_connect") 

    def __on_disconnect(self, client, userdata, flags, rc): 
     print("one: on_disconnect") 

    def __on_message(self, client, userdata, message): 

     str_message = message.payload.decode('utf-8') 
     message = json.loads(str_message) 
     print("one: on_message: " + str(message)) 

    def is_alive(self): 
     return True 

jedoch - wenn ich ein Paket senden, das erzeugt ein Fehler (eine gebeizte Nachricht anstelle von zB json) meine "is_alive" -Funktion gibt immer noch True zurück, aber die Paho-Implementierung reagiert nicht mehr. Es werden also keine weiteren Nachrichten an on_message gesendet. Also reagiert nur ein Teil der Klasse noch ?! Klasse "zwei" reagiert immer noch und das Skript läuft immer noch in "while True".

Wie überprüfe ich die Funktionalität einer solchen Klasse richtig?

+0

Mögliche Duplikate von [wie Python-Skript als Dienst ausgeführt werden?] (Https://StackOverflow.com/Questions/16420092/How-To-Make-Python-Script-Run-AS-Service) – LeopoldVonBuschLight

Antwort

0

Ich denke, Sie müssen eine Checker-Methode wie class1.isAlive() erstellen, die Ihnen sagt, ob die Klasse für Anfragen wartet. Ich denke auch, dass Sie dies in der while True Schleife aufbauen und reagieren müssen als auf Fehler.

Zusätzlich könnten Sie Ihr eigenes Ereignis mit einer Wartefunktion schreiben. Warten ist mehr CPU-hungrig, aber es reagiert besser. Siehe zum Beispiel here. Aber es hängt von deiner Python-Version ab.

+0

Ich habe versucht fügen Sie eine solche Checker-Funktionalität hinzu, aber ich bin mir nicht sicher, wie Sie es richtig machen - ich habe meinen Beitrag entsprechend bearbeitet. – hamso

Verwandte Themen