【问题标题】:MQTT subscribing does not work properly in MultithreadingMQTT 订阅在多线程中无法正常工作
【发布时间】:2021-08-12 08:02:47
【问题描述】:

我有如下代码


    threads = []
    t = threading.Thread(target=Subscribe('username', "password", "topic", "host",port).start)
    t1 = threading.Thread(target=Subscribe('username2', "password2", "topic2", "host",port).start)
    
    threads.append(t)
    threads.append(t1)
    
    for thread in threads:
        thread.start()
    
    for thread in threads:
        thread.join()

我的主题每 5 分钟发送一次数据。

当我使用上面的代码时,它不能正常工作,有时它会发送数据有时它不会。

但是当我使用一个没有 thread 的主题时,它可以正常工作,并且数据每 5 分钟就会完美地输入一次。

我该如何解决这个问题?我想同时订阅两个主题

我将 Paho 用于 MQTT

我的订阅课程是

class Subscribe:

    def __init__(self, username, passowrd, topic, host, port):

        self.username = username
        self.password = passowrd
        self.topic = topic
        self.host = host
        self.port = port
       
      

    def start(self):
        self.mqttc = mqtt.Client(client_id="Python")
        self.connected = False
        self.mqtt_message = ""
        self.mqttc.username_pw_set(self.username, self.password)
        self.mqttc.on_connect = self.on_connect
        self.mqttc.on_message = self.on_message
        self.mqttc.connect(self.host, self.port)
        self.mqttc.loop_forever()

    def on_message(self, client, userdata, message):
        """
        Fetch data when data coming to Broker
        """
        topic = message.topic
        m = json.loads(message.payload.decode("utf-8"))
        print(m)

   


    def on_connect(self, client, userdata, flags, rc):
        if rc == 0:
            print("Connected to broker", self.topic)
            self.mqttc.subscribe(self.topic)
            self.connected = True

        else:
            print("could not connect", self.topic)

【问题讨论】:

  • 您使用的是哪个 mqtt 库?它可能不是为处理多线程而构建的,因此您会导致数据竞争并违反库的假设,从而导致它无法正常工作。
  • 它是 python-paho
  • 我需要更多信息来提供帮助。你能展示你的订阅功能吗?您是否创建了paho.mqtt.client.Client() 的实例?它在哪里?
  • 我编辑了@LouisCloete 看看。
  • 为什么需要 2 个独立的客户端?单个客户端可以订阅任意数量的主题(或匹配多个主题的通配符)并处理所有消息。

标签: python python-3.x multithreading mqtt python-multithreading


【解决方案1】:

我必须为Client 的两个实例提供两个不同的client_ids,它解决了这个问题。

【讨论】:

  • 啊,有道理。您仍然可以检查是否有必要自己创建 2 个线程。我怀疑 paho 自己在内部进行并发,这使得创建自己的线程变得多余。
猜你喜欢
  • 2016-07-26
  • 2018-02-01
  • 1970-01-01
  • 2013-07-12
  • 2020-03-05
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多