Python/Django постоянная подписка на тему MQTT Mosquito и получение данных

В моем проекте django я хочу подписаться на тему MQTT навсегда и запускать действия при изменении темы. В моем __init__.py файле приложения я пытаюсь:

client1 = mqtt.Client(hex(uuid.getnode()))
data_dict = init_client('IOT/Data/#')

for k, v in data_dict.items():
    ...do some stuff with data

функция init_client подключается к моему MQTT серверу и запускает цикл (я использую paho.mqtt.client):

def init_client(t_topic='IOT/Data/#'):
# Instantiate and check connection about MQTT instance
client1.on_connect = on_connect  # attach function to callback
client1.on_message = on_message  # attach function to callback
if t_topic == 'IOT/Data/#':
    client1.message_callback_add(t_topic, on_message_data)
else:
    client1.message_callback_add(t_topic, on_message_reg)
client1.on_publish = on_publish  # attach function to callback
# client1.on_subscribe =on_subscribe
# attach function to callback
try:
    client1.tls_set(mqtt_ca_crt, mqtt_cli_crt, mqtt_cli_key)
    client1.tls_insecure_set(True)
except ValueError:
    logging.info("SSL/TLS Already configured")
time.sleep(1)

try:
    if not client1.is_connected():
        client1.connect(mqtt_server, mqtt_port)  # connect to broker
        client1.connected_flag = False
    
except Exception:
    logging.error("Cannot connect MQTT Client1")

client1.loop_forever()
...and some other stuff

проблема в том, что когда запускается loop_forever(), все приложение django замирает, ожидая вечность.

Итак, мой вопрос заключается в следующем: Как я могу подписаться на тему с помощью paho.mqtt (асинхронно) при запуске моей django allpication и получать уведомления каждый раз, когда тема меняется в реальном времени? Есть ли другие более умные способы сделать это с помощью django?

Заранее большое спасибо

Из Python Paho doc

loop_start() / loop_stop()

loop_start()
loop_stop(force=False)

Эти функции реализуют потоковый интерфейс к сетевому циклу. Вызов функции loop_start() один раз, до или после connect*(), запускает поток в фоновом режиме для автоматического вызова loop(). Это освобождает основной поток для другой работы, которая может быть блокирована. Этот вызов также обрабатывает повторное подключение к брокеру. Вызовите loop_stop(), чтобы остановить фоновый поток поток. Аргумент force в настоящее время игнорируется.

Вернуться на верх