Python: как прекратить поток после завершения основной программы

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

64 голоса | спросил facha 2 AMpFri, 02 Apr 2010 02:44:52 +040044Friday 2010, 02:44:52

5 ответов


0

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

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

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

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

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

ответил rogeriopvl 2 AMpFri, 02 Apr 2010 02:51:56 +040051Friday 2010, 02:51:56
0

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

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

ответил ʇsәɹoɈ 2 AMpFri, 02 Apr 2010 03:35:24 +040035Friday 2010, 03:35:24
0

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

ответил Alex Martelli 2 AMpFri, 02 Apr 2010 06:43:04 +040043Friday 2010, 06:43:04
0

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

ответил Milean 14 AM00000010000005031 2013, 01:25:50
0

Попробуйте включить подпоток как 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 »), это другие темы убивают с помощью вышеуказанной инструкции.

ответил Benyamin Jafari 7 PM000000120000000631 2018, 12:28:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132