python: как завершить поток, когда основная программа заканчивается


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

5 61

5 ответов:

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

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

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

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

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

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

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

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

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

попробуйте включить подпоток в качестве daemon-thread.

Например:

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"), что другие потоки убивает С выше инструкции.