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