簡體   English   中英

將 paho MQTT 與 Python 中的另一個異步進程相結合

[英]Combine paho MQTT with another asyncio process in Python

我在 Python 中有一個基本的 MQTTLListener class ,它偵聽有關某些主題的消息,並且應該啟動或停止從另一個腳本導入的異步進程。 這個過程永遠運行,除非它被手動停止。 讓我們假設 Listener 看起來像這樣:

import paho.mqtt.client as mqtt
import json
from python_file.py import async_forever_function

class MqttListener:

    def __init__(self, host, port, client_id):
        self.host = host
        self.port = port
        self.client_id = client_id
        self.client = mqtt.Client(client_id=self.client_id)
        self.client.connect(host=self.host, port=self.port)

    def on_connect(self, client, userdata, flags, rc):
        self.client.subscribe(topic=[("start", 1), ])
        self.client.subscribe(topic=[("stop", 1), ])
        logging.info(msg="MQTT - connected!")

    def on_disconnect(client, userdata, rc):
        logging.info(msg="MQTT - disconnected!")

    def on_message(self, client, userdata, message, ):
        print('PROCESSING MESSAGE', message.topic, message.payload.decode('utf-8'), )

        if message.topic == 'start':
            async_forever_function(param='start')
            print('process started')
        else:
            async_forever_function(param='stop')
            print('process removed')

    def start(self):
        self.client.on_connect = lambda client, userdata, flags, rc: self.on_connect(client, userdata, flags, rc)
        self.client.on_message = lambda client, userdata, message: self.on_message(client, userdata, message)
        self.client.on_disconnect = lambda client, userdata, rc: self.on_disconnect(client, userdata, rc)

        self.client.loop_start()

    def stop(self):
        self.client.loop_stop()

現在,這適用於啟動一個新的異步進程。 也就是說,當一條消息發布到啟動 MQTT 主題時,會正確觸發 async_function。 然而,一旦這個異步進程啟動,監聽器將不再能夠接收/處理來自停止 MQTT 主題的消息,並且異步進程將繼續永遠運行,而事實上它應該已經停止。

我的問題:如何調整此 class 的代碼,以便在后台運行活動異步進程時它也可以處理消息?

您不能在on_message()回調中執行阻塞任務。

此回調在 MQTT 客戶端線程上運行(由loop_start() function 啟動的線程。此線程處理所有網絡流量和消息處理,如果您阻止它,則它無法執行任何操作。

如果你想從on_message()回調中調用長時間運行的任務,你需要為長時間運行的任務啟動一個新線程,這樣它就不會阻塞 MQTT 客戶端循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM