[英]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.