Объединение loop_start(), loop_stop() и loop_forever(); запуск отдельного приложения

#python #mqtt #paho

#python #mqtt #paho

Вопрос:

Правильно ли использовать client.loop_start() , делать некоторые вещи, затем client.loop_stop() и, наконец client.loop_forever() ?

Контекст: у меня есть bootloader.py на моем устройстве Raspberry. Загрузчик должен запускаться автоматически при загрузке устройства. Загрузчики подключаются к серверу приложений (через выделенный IP и раздел), проверяют ожидаемое программное обеспечение, установленное на устройстве, загружают новое программное обеспечение, если оно недоступно локально, запускают нужное приложение, а затем загрузчик должен стать подписчиком, который прослушивает «служебные сообщения» извне. (Например: «отправьте мне свой статус», «проверьте наличие нового программного обеспечения, и если есть что-то новое, загрузите его и перезагрузите устройство».

Текущая реализация: я уже реализовал процесс загрузки и запуска нужного приложения. Реализация использует client.loop_start() (то есть обрабатывает обмен данными с использованием отдельного потока). После загрузки нужных файлов вызывается загрузчик subprocess.Popen(cmd) и становится процессом запущенного приложения.

Что я хочу: теперь я хочу отделить процесс запущенного приложения. Загрузчик должен стать клиентом, который слушает вечно. Моя идея заключалась в том, чтобы client.loops_stop() после завершения связи с сервером приложений запустить приложение, а затем client.loop_forever() в качестве последнего действия скрипта заставить его прослушивать навсегда. Правильный ли такой подход?

Является ли описанная ситуация обычной? Это хорошо известный шаблон? Если да, не могли бы вы указать мне на соответствующую документацию? Если нет, видите ли вы какой-либо недостаток в подходе?

Ответ №1:

На самом деле это не тот шаблон, который я видел где-либо еще, но если он соответствует вашим потребностям.

Единственная проблема будет заключаться в том, что время между вызовом loop_stop() и loop_forever() будет больше, чем период ожидания, что приведет к отключению клиента брокером.

Вы также можете получить пакет сообщений при перезапуске цикла событий.

Комментарии:

1. Спасибо hardillb. Можете ли вы прокомментировать реализацию Python paho mqtt? (Вероятно, только интерфейс к библиотеке C .) Поскольку loop_start() создает новый поток, блокирует ли loop_stop() до тех пор, пока поток не будет остановлен. Если loop_forever() вызывается немедленно, я предполагаю, что это создает новый поток. Могу ли я считать «пакет сообщений» довольно минимальным в таком случае? На самом деле, моя цель — сделать процесс загрузчика живым, чтобы обслуживать «сервисные действия». Вы бы порекомендовали другой подход?

2. loop_forever() не запускает новый поток, он запускает (и блокирует) текущий поток, который вызывает функцию. Поскольку вы отметили вопрос как python, все комментарии относятся к библиотеке python paho