ho questo decoratore presa direttamente da un esempio che ho trovato in rete:Time out decoratore su una funzione multprocessing
class TimedOutExc(Exception):
pass
def timeout(timeout):
def decorate(f):
def handler(signum, frame):
raise TimedOutExc()
def new_f(*args, **kwargs):
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(timeout)
try:
result = f(*args, **kwargs)
except TimedOutExc:
return None
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
new_f.func_name = f.func_name
return new_f
return decorate
Si genera un'eccezione se i tempi di funzione f fuori.
Bene, funziona, ma quando uso questo decoratore su una funzione di multiprocessing e si interrompe a causa di un timeout, non termina i processi coinvolti nel calcolo. Come lo posso fare?
Non voglio avviare un'eccezione e interrompere il programma. Fondamentalmente quello che voglio è quando f scade, farlo restituire None e quindi terminare i processi coinvolti.
Sembra che funzioni. Conservo il mio decoratore perché il tuo non restituisce Nessuno in una funzione non parallela a meno che non gestisca sempre l'eccezione nella funzione. Quello che ho fatto è gestire l'eccezione come hai fatto solo nella parte del codice di calcolo parallelo della funzione e il gioco è fatto. Grazie mille. Molto chiaro. – blueSurfer
Grazie per aver condiviso. Mantenere l'arredatore originale ha davvero senso. – EOL