Как определить завершение потока?

Как я могу определить завершение этого потока и по его завершению сделать какое-нибудь действие? Возможно ли это? Исполнить это действие в самой функции func не могу.

from threading import Thread
x = threading.Thread(target=func)
x.start()

Если добавить после строки x.start() строку x.join(), то программа виснет, до завершения потока, как будто все в главном потоке и выполняется.


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

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

Можно сделать поток, который будет проверять состояние данного потока:

from threading import Thread

def func():
    for i in range(10):
        u = [[x,t,y] for x in range(100) for t in range(100) for y in range(100)]

def rev(thread):
    thread.join()
    print('Поток завершил работу.')

x = Thread(target=func)
x_r = Thread(target=rev, args=(x,))
x.start()
x_r.start()
→ Ссылка
Автор решения: alex

есть еще вариант с глобальной переменной

import threading
import time

_STATE = [False]


def change_state(fun):
    def wrapper(*args, **kwargs):
        _STATE[0] = True
        try:
            fun(*args, **kwargs)
        except Exception as e:
            # show exception
            pass
        finally:
            _STATE[0] = False


@change_state
def thr():
    for i in range(10):
        _ = [[x,t,y] for x in range(100) for t in range(100) for y in range(100)]


x = Thread(target=thr)
x.start()
while _STATE[0]:
    time.sleep(1)
→ Ссылка