Seite 2 von 2

Re: auf input 30s lang warten und dann Programm von vorne starten

Verfasst: Donnerstag 7. März 2019, 15:09
von DeaD_EyE
Unter Linux könntest du Signale benutzen. Da gibt es z.B. SIGALRM.

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
Verwendung:

Code: Alles auswählen

with timeout(5):
    input('Wie ist dein Name: ')
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.