в этой ветке много обсуждается, почему не рекомендуется убивать потоки. И я согласен, когда мы говорим о реальной программе. Я пишу модульные тесты для нескольких компонентов, а также некоторые интеграционные тесты между ними. Некоторые из них требуют потоковой обработки. Когда тесты терпят неудачу, некоторые потоки остаются открытыми, запертыми в .get()
очереди. Это заставляет весь набор тестов застревать, а не полностью. Я запускаю либо ptw
(pytest watch), либо пользовательский цикл pytest с inotifywait
чтобы следить за изменениями в моих файлах, чтобы перезапустить пакет.
Когда все тесты завершены, я хочу, чтобы пакет убивал все оставшиеся потоки, чтобы завершить цикл, и не застрять на потоке где-то, что просто открыто из-за ошибки теста. Это возможно?
Не существует изящного способа остановить поток, но вы можете установить для своего daemon
значение True
.
фрагмент кода:
import threading
all_child_threads = [thread for thread in threading.enumerate() if thread != threading.main_thread()]
for thread in all_child_threads:
thread.daemon = True
Затем они прекратятся, когда основной поток прекратится.
tearDownClass
всех классов, использующих многопоточность в моих тестах, но глобальный хук был бы лучше.