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 шт):
Не надо ничего джойнить, когда закончится метод 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()