Re: auf input 30s lang warten und dann Programm von vorne starten
Verfasst: Donnerstag 7. März 2019, 15:09
Unter Linux könntest du Signale benutzen. Da gibt es z.B. SIGALRM.
Hier mal ein Beispiel:
Verwendung:
Hinsichtlich threading wäre ich mit Signalen vorsichtig. Soweit ich weiß werden die Signal-Handler vom main-thread geerbt.
Wenn man z.B. erst den Handler im main thread setzt, dann neue threads erstellt, so bekommen alle Threads auch SIGALRM und müssten entsprechend auch einen TimeoutError bekommen.
Überleg dir mal was, wie man einen Contextmanager mit threading.Timer nutzen könnte.
Hier mal ein Beispiel:
Code: Alles auswählen
from signal import signal
from signal import alarm
from signal import SIGALRM
from contextlib import contextmanager
def callback(*args):
raise TimeoutError
@contextmanager
def timeout(delay, fail=True):
signal(SIGALRM, callback)
alarm(delay)
try:
yield
except TimeoutError:
if fail:
raise
Code: Alles auswählen
with timeout(5):
input('Wie ist dein Name: ')
Wenn man z.B. erst den Handler im main thread setzt, dann neue threads erstellt, so bekommen alle Threads auch SIGALRM und müssten entsprechend auch einen TimeoutError bekommen.
Überleg dir mal was, wie man einen Contextmanager mit threading.Timer nutzen könnte.