python: как завершить поток, когда основная программа заканчивается
Если у меня есть поток в бесконечном цикле, есть ли способ завершить его, когда основная программа заканчивается (например, когда я нажимаю Ctrl+C)?
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"), что другие потоки убивает С выше инструкции.