Python: как прекратить поток после завершения основной программы - PullRequest
69 голосов
/ 02 апреля 2010

Если у меня есть поток в бесконечном цикле, есть ли способ прекратить его, когда основная программа заканчивается (например, когда я нажимаю Ctrl + C )

Ответы [ 5 ]

82 голосов
/ 02 апреля 2010

Если вы сделаете свои рабочие потоки потоками демонов, они умрут, когда все ваши потоки, не являющиеся демонами (например, основной поток), закроются.

http://docs.python.org/library/threading.html#threading.Thread.daemon

41 голосов
/ 02 апреля 2010

Проверьте этот вопрос. Правильный ответ имеет отличное объяснение того, как правильно завершать темы: Есть ли способ убить поток в Python?

Чтобы остановить поток по сигналу прерывания клавиатуры (ctrl + c), вы можете перехватить исключение «KeyboardInterrupt» и очистить перед выходом. Как это:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

Таким образом, вы можете контролировать, что делать, когда программа внезапно завершается.

Вы также можете использовать встроенный модуль сигналов, который позволяет настраивать обработчики сигналов (в вашем конкретном случае сигнал SIGINT): http://docs.python.org/library/signal.html

12 голосов
/ 02 апреля 2010

Используйте модуль atexit стандартной библиотеки Python для регистрации «завершающих» функций, которые вызываются (в основном потоке) при любом достаточно «чистом» завершении основного потока, включая необработанное исключение, такое как KeyboardInterrupt. Такие функции завершения могут (хотя и неизбежно в главном потоке!) Вызывать любую функцию stop, которая вам требуется; вместе с возможностью установки потока как daemon, что дает вам инструменты для правильного проектирования необходимых вам системных функций.

8 голосов
/ 07 августа 2018

Попробуйте включить подпоток как поток-демон.

Например:

from threading import Thread

threaded = Thread(target=<your-method>)
threaded.daemon = True  # This thread dies when main thread (only non-daemon thread) exits.
threaded.start()

Или (в строке):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()

Когда ваш основной поток завершается (например, когда я нажимаю Ctrl + C "), который другие потоки убивают вышеуказанная инструкция.

8 голосов
/ 14 августа 2013

Если вы создаете Нить как - myThread = Thread(target = function) - и затем делаете myThread.start(); myThread.join(). Когда инициируется CTRL-C, основной поток не завершает работу, поскольку ожидает этого блокирующего вызова myThread.join(). Чтобы это исправить, просто укажите время ожидания для вызова .join (). Тайм-аут может быть так долго, как вы хотите. Если вы хотите, чтобы ожидание длилось бесконечно, просто введите очень большой тайм-аут, например 99999. Хорошей практикой также является выполнение myThread.daemon = True, чтобы все потоки выходили при выходе из основного потока (не демона).

...