Ho timeout
contesto gestore che funziona perfettamente con i segnali ma solleva errore nella modalità multithread perché segnali funzionano solo in thread principale.pitone timeout gestore contesto con fili
def timeout_handler(signum, frame):
raise TimeoutException()
@contextmanager
def timeout(seconds):
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(seconds)
try:
yield
finally:
signal.alarm(0)
signal.signal(signal.SIGALRM, old_handler)
Ho visto implementazione decoratore di timeout
, ma non so come passare yield
all'interno classe derivata da threading.Thread
. La mia variante non funzionerà.
@contextmanager
def timelimit(seconds):
class FuncThread(threading.Thread):
def run(self):
yield
it = FuncThread()
it.start()
it.join(seconds)
if it.isAlive():
raise TimeoutException()
Come nel mio primo variante ho ottenuto 'ValueError: segnale funziona solo in thread' principale riga 'original_handler = signal.signal (signal.SIGALRM, timeout_handler)' – San4ez
Come indicato dall'OP, * i segnali funzionano solo nel thread principale *. L'OP necessita invece di una soluzione diversa. –