Не закрывается программа при exit() и quit()

Проблема такова:

Имеется программа, которая работает многопоточно. Есть основной поток и 2 дочерних. В дочерних бесконечные циклы. Я вызываю при определенных условиях функцию exit() или quit() в первом дочернем потоке. Проблема в том, что когда используется команда quit или exit, то программа не завершается. Поток, в котором вызвана функция завершается, как и основной поток. Но при этом второй дочерний поток продолжает работать и даже флудить сообщениями с логами в консоль, как будто он продолжает работать. И так, пока вручную не закрою на крестик окошко с консолью.

Данная проблема наблюдается только при запуске программы двойным кликом по скрипту. Если запускать из редактора на Ф5, то консоль редактора (в IDLE тоже) закрывается вместе с приложением и все потоки умирают соответственно (по крайней мере они не подают признаков жизни, может и занимают место в памяти, но работать - не работают, с этим все в порядке).

Сталкивался ли кто-то с такой проблемой?


Ответы (1 шт):

Автор решения: Roman Konoval

Программа на python завершает свое выполнение, когда все не фоновые (в английской документации daemon thread) потоки закончили свое выполнение. Когда новый поток создается, то его тип (фоновый или нет) наследуется от потока, который его создает. Главный поток программы - не фоновый.

Из этого всего следует, что если главный поток не дожидается завершения порожденных не фоновых потоков, то программа не закончит свое выполнение, пока не завершатся порожденные потоки.

Исправить проблему можно двумя способами:

  1. перед выходом послать всем потокам сигнал, чтобы они завершились. Для этого можно использовать примитивы синхронизации типа threading.Event
  2. передать параметр daemon=True в конструктор Thread, для каждого потока, которого не нужно ждать для завершения программы. Учтите только, что все такие потоки завершатся не выполнив необходимой очистки, то есть, например, не закрыв корректно открытые файлы и т.п.
→ Ссылка