Как завершить поток когда концы основной программы?

В дополнение к комментарию Аконда , обратите внимание, что использование as-> может быстро запутать. Я рекомендую либо извлечь функцию верхнего уровня для этих случаев, либо попытаться использовать as-> только в ->:

(-> something
    (process-something)
    (as-> $ (do-something $ (very-complicated $)))
    (finish-processing))

74
задан martineau 20 November 2019 в 00:37
поделиться

4 ответа

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

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

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

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

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

42
ответ дан 24 November 2019 в 11:56
поделиться

Потоки демона уничтожаются неизящно, таким образом, любые инструкции по финализатору не выполняются. Возможное решение состоит в том, чтобы проверить, основной поток, живо вместо бесконечного цикла.

, Например, для Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

Видят Проверка, если Основной Поток все еще жив от другого потока .

0
ответ дан 24 November 2019 в 11:56
поделиться

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

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

86
ответ дан 24 November 2019 в 11:56
поделиться

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

12
ответ дан 24 November 2019 в 11:56
поделиться
Другие вопросы по тегам:

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