Убивает все процессы и потоки в python3 .X - PullRequest
1 голос
/ 13 июля 2020

Я пишу оболочку UI для чтения некоторой информации с помощью esptool.py

У меня есть два активных потока: UI и обработка - SerialReader. Класс UI имеет ссылку на SerialReader и должен останавливать SerialReader, когда получает команду выхода.

Проблема в том, что я вызываю команду esptool, которая застревает при попытке прочитать данные через последовательное соединение.

class SerialReaderProcess(threading.Thread):

    def __init__(self, window):
        super().__init__()
        self.window = window
        self.logger = window.logger
        self.window.set_thread(self)
        self._stop_event = threading.Event()

    def run(self):
        ...
        #read chip id
        esptool.main(['chip_id'])
        ...

    def stop(self):
        self._stop_event.set()

    def stopped(self):
        return self._stop_event.is_set()

Я хочу убить все активные процессы этой программы. Когда я вызываю закрытие пользовательского интерфейса и вызываю serialReaderProcess.stop(), процесс не останавливается. Я вижу вывод esptool на консоли.

Меня не волнует, если я что-нибудь прерву, никакие данные не могут быть повреждены.

Я пробовал sys.exit(0) безрезультатно. Я изучил проблему, но не смог найти решения.

ОС - Ubuntu, и меня не интересуют кроссплатформенные функции, но они были бы хороши

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Как указано в комментариях, установка потока как Daemon решила проблему:

super().__init__(daemon=True)

Потоки демона автоматически убиваются при выходе из программы.

Подробнее о демонах: Daemon Резьбы Описание

0 голосов
/ 13 июля 2020

Первый импорт библиотеки ОС:

Import os

Затем вы можете написать следующий код в своем методе exit_event:

def closeEvent(self, event):  
    output,errors = p1.communicate() 
    bashCommand = "killall python3"
    sudoPassword = 'your password' 
    p = os.system('echo %s|sudo -S %s' % (sudoPassword, bashCommand)) 
...