如何使多个Paho MQTT客户端作为服务/守护程序运行

时间:2017-09-07 12:05:40

标签: python loops service mqtt paho

我想实现一个始终运行,接收和发送消息的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

然而 - 如果我发送一个产生错误的包(例如一个pickle消息而不是json)我的" is_alive" -function仍然返回True但是paho实现不再响应了。因此,不会向on_message发送更多消息。所以只有一部分课程仍然响应!? Class" two"仍然响应,脚本在"同时运行"仍然。

如何正确检查此类的功能?

1 个答案:

答案 0 :(得分:0)

我认为你必须构建一个像class1.isAlive()这样的检查器方法,它告诉你类是否在等待请求。另外我认为你必须在while True循环中构建它并做出反应而不是失败。

此外,您可以使用等待功能编写自己的事件。等待是更多的CPU饥饿,但它更敏感。例如,请参阅here。但这取决于你的python版本。