В дополнение к комментарию Аконда , обратите внимание, что использование as->
может быстро запутать. Я рекомендую либо извлечь функцию верхнего уровня для этих случаев, либо попытаться использовать as->
только в ->
:
(-> something
(process-something)
(as-> $ (do-something $ (very-complicated $)))
(finish-processing))
Отметьте этот вопрос. Правильный ответ содержит прекрасное объяснение того, как правильно завершить потоки: Есть ли способ убить поток в Python?
Чтобы остановить поток по сигналу прерывания клавиатуры (ctrl + c ) вы можете перехватить исключение «KeyboardInterrupt» и очистить перед выходом. Примерно так:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
Таким образом, вы можете контролировать, что делать, когда программа внезапно завершается.
Вы также можете использовать встроенный модуль сигналов, который позволяет вам настраивать обработчики сигналов (в вашем конкретном случае сигнал SIGINT): http://docs.python.org/library/signal.html
Потоки демона уничтожаются неизящно, таким образом, любые инструкции по финализатору не выполняются. Возможное решение состоит в том, чтобы проверить, основной поток, живо вместо бесконечного цикла.
, Например, для Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
Видят Проверка, если Основной Поток все еще жив от другого потока .
Если вы сделаете свои рабочие потоки потоками-демонами, они умрут, когда все ваши не-демонические потоки (например, основной поток) завершатся.
http://docs.python.org/library/threading.html#threading.Thread.daemon
Используйте модуль atexit стандартной библиотеки Python для регистрации функций «завершения», которые вызываются (в основном потоке) при любом разумно «чистом» завершении основного потока, включая неперехваченное исключение, такое как KeyboardInterrupt
. Такие функции завершения могут (хотя неизбежно в основном потоке!) Вызывать любую функцию stop
, которая вам нужна; вместе с возможностью установки потока как демона
, который дает вам инструменты для правильного проектирования необходимых вам системных функций.