То, что вы описываете, это потоки, которые могут быть асинхронно остановлены.
Как описано здесь , существует два основных подхода.Одним из них является проверка кода потока для какого-либо события (запускаемого u.stop()
в вашем примере) для каждой выполняемой операции.
Другое решение - принудительно вызвать ошибку в каком-либо потоке.Этот подход проще реализовать, но он может вызвать неожиданное поведение, и чем сложнее код вашего потока, тем опаснее он становится.
import ctypes
ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
Где tid
- поток, который должен быть завершен.Вы можете получить идентификатор потока, запустив (в теме):
print self._thread_id
Подробнее об этом можно прочитать в блоге thread2 , опубликованном Томером Филиба.