Python threading.Thread join() (inside class)

Не могу найти, возможно ли заджойнить тред изнутри класса-наследника threading.Thread

import threading, time

class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        # threading.Thread.join(self) - не работает
        time.sleep(0.2)
        print('ONE')

if __name__ == '__main__':
    mt = MyThread()
    mt.start()
    # mt.join() - так не интересно
    print('TWO')

Ответы (1 шт):

Автор решения: CrazyElf

Не надо ничего джойнить, когда закончится метод run, поток закончится автоматически:

    # ...
    #mt.join() #- так не интересно
    print(mt.is_alive())
    while mt.is_alive():
        time.sleep(0.1)
        print('Waiting...')
    print('TWO')
    print(mt.is_alive())

Вывод:

True
Waiting...
ONE
Waiting...
TWO
False

Хотите закончить тред раньше - делаете досрочный return из метода run и тред закончится.

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

Изнутри же потока join просто не имеет смысла - он нужен чтобы ждать, когда закончится поток-потомок, в самом потоке вы просто заканчиваете работу - и всё, "рабочее место убрано", без всякой дополнительной магии.

Update: Если не хотите явно ждать в родительском треде и не хотите использовать, например, async/await, то можно просто в потомке бросить исключение, а в родителе его поймать:

    def run(self):
        print('ONE')
        time.sleep(5)
        raise Exception()
        sleep(1000)

if __name__ == '__main__':
    mt = MyThread()
    mt.start()
    #mt.join() #- так не интересно
    try:
        sleep(100) # здесь какая-то работа, которую нужно прервать из потомка
    except:
        print('Thread aborted!')
    print('TWO')
    mt.join()
→ Ссылка