Как поддерживать работу нескольких клиентов Paho MQTT в качестве службы/демона

Я хочу реализовать службу Paho MQTT Python, которая всегда работает, получает и отправляет сообщения. Если в любом случае возникает ошибка, он должен перезапуститься.

Я реализовал два класса, каждый из которых запускает многопоточный сетевой цикл с помощью paho loop_start(). Затем эти классы имеют некоторые функции обратного вызова, которые вызывают другие классы и так далее.

На данный момент у меня есть простой скрипт Python, который вызывает классы и циклы:

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)

А вот мой класс "один":

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

Однако, если я отправляю пакет, который выдает ошибку (например, маринованное сообщение вместо json), моя функция «is_alive» по-прежнему возвращает True, но реализация paho больше не отвечает. Таким образом, дальнейшие сообщения не отправляются на on_message. Так что только часть класса все еще отвечает!? Класс «два» по-прежнему отвечает, и скрипт все еще работает в режиме «пока правда».

Как правильно проверить функциональность такого класса?


person hamso    schedule 07.09.2017    source источник
comment
Возможный дубликат Как заставить скрипт Python работать как сервис?   -  person LeopoldVonBuschLight    schedule 07.09.2017


Ответы (1)


Я думаю, вам нужно создать метод проверки, такой как class1.isAlive(), который сообщает вам, ожидает ли класс запросов. Также я думаю, что вы должны построить это в цикле while True и реагировать на сбои.

Кроме того, вы можете написать собственное событие с функцией ожидания. Подождите больше процессора, но он более отзывчив. См., например, здесь. Но это зависит от вашей версии Python.

person M Dennis    schedule 07.09.2017
comment
Я пытался добавить такую ​​функцию проверки, но я не совсем уверен, как это правильно сделать - я соответствующим образом отредактировал свой пост. - person hamso; 08.09.2017