Хорошо, я нашел способ сделать это сам.
Глядя на исходный код Python, выясняется, что при завершении работы Python пытается присоединиться () ко всем недемоническим потокам до завершения завершения работыпроцесс.Какой тип имеет смысл, за исключением того, что это было бы гораздо более полезным, если бы существовал документированный способ сигнализации этих потоков.Чего нет.
Однако, позволяет повторно реализовать метод join () своего собственного класса, производного от Thread, который может служить способом уведомленияподзадача о том, что он должен сам отключиться:
class MyThread(threading.Thread):
def __init__(self):
super().__init__()
self._quit_flag = False
def __del__(self):
print("Bye bye!")
def run(self):
while not self._quit_flag:
print("Thread is alive!", threading.active_count(), threading.main_thread().is_alive())
for t in threading.enumerate():
print(t.is_alive())
time.sleep(0.500)
def request_quit(self):
self._quit_flag = True
def join(self):
self.request_quit()
super().join()
Однако, этот способ решения проблемы в значительной степени является хакерским, и он игнорирует следующий отрывок из документации модуля 'threading' (https://docs.python.org/3/library/threading.html):
Класс Thread представляет действие, которое запускается в отдельном потоке управления. Существует два способа указать действие: путем передачи вызываемого объекта в конструктор или переопределением выполнения () в подклассе. Никакие другие методы (кроме конструктора) не должны быть переопределены в подклассе. Другими словами, только переопределите методы __init __ () и run () этого класса .
Тем не менее, он прекрасно работает.