Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich zeitgebundene Benutzereingaben in Python implementieren?

Wie kann ich zeitgebundene Benutzereingaben in Python implementieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-27 07:43:16464Durchsuche

How Can I Implement Time-Bound User Input in Python?

Zeitgebundene Benutzereingaben: Lösungen erkunden

In der dynamischen Welt der Programmierung ist es häufig notwendig, Benutzereingaben zeitliche Beschränkungen aufzuerlegen . Stellen Sie sich das Szenario vor, in dem Sie einem Benutzer eine Frage stellen und die Zeit begrenzen möchten, die er zum Antworten hat. Die Bewältigung dieser Aufgabe in Python mag einfach erscheinen, bringt jedoch eine Reihe eigener Herausforderungen mit sich.

Ein Ansatz besteht darin, das Threading-Modul zu verwenden. Indem Sie ein Timer-Objekt erstellen und dessen Dauer festlegen, können Sie einen Countdown starten. Während dieser Zeit bleibt der Code blockiert und wartet auf Benutzereingaben. Läuft die Zeit ab, bevor eine Antwort eintrifft, kann eine entsprechende Meldung angezeigt werden. Der folgende Codeausschnitt veranschaulicht diesen Ansatz:

from threading import Timer

timeout = 10
t = Timer(timeout, print, ['Sorry, times up'])
t.start()
prompt = "You have %d seconds to choose the correct answer...\n" % timeout
answer = input(prompt)
t.cancel()

Diese Methode hat jedoch ihre Grenzen. Das Blockieren des Hauptthreads kann die Ausführung anderer Aufgaben innerhalb des Programms behindern. Daher werden alternative Ansätze erforderlich, die einen nicht blockierenden Betrieb ermöglichen.

Betriebssystemspezifische Lösungen

Für Windows-Systeme können Sie msvcrt Modul, das eine Low-Level-Schnittstelle für Tastatureingaben bereitstellt. Die Ausnahme TimeoutExpired wird ausgelöst, wenn das angegebene Zeitlimit überschritten wird, sodass Sie entsprechend mit der Situation umgehen können. Hier ist eine Implementierung:

import msvcrt
import time

class TimeoutExpired(Exception):
    pass

def input_with_timeout(prompt, timeout, timer=time.monotonic):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    endtime = timer() + timeout
    result = []
    while timer() < endtime:
        if msvcrt.kbhit():
            result.append(msvcrt.getwche()) #XXX can it block on multibyte characters?
            if result[-1] == '\r':
                return ''.join(result[:-1])
        time.sleep(0.04) # just to yield to other processes/threads
    raise TimeoutExpired

Unix-basierte Verbesserungen

Auf Unix-ähnlichen Systemen können Sie das Modul

select erkunden. Damit können Sie Dateideskriptoren überwachen und auf bestimmte Ereignisse warten, einschließlich Tastatureingaben innerhalb eines bestimmten Zeitrahmens. Der folgende Codeausschnitt veranschaulicht diese Technik:

import select
import sys

def input_with_timeout(prompt, timeout):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    ready, _, _ = select.select([sys.stdin], [],[], timeout)
    if ready:
        return sys.stdin.readline().rstrip('\n') # expect stdin to be line-buffered
    raise TimeoutExpired
Alternativ können Sie das Modul

Signal verwenden. Indem Sie einen Timer einstellen und das resultierende SIGALRM-Signal verarbeiten, können Sie der Benutzereingabe eine Zeitbeschränkung auferlegen. So geht's:

import signal

def alarm_handler(signum, frame):
    raise TimeoutExpired

def input_with_timeout(prompt, timeout):
    # set signal handler
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout) # produce SIGALRM in `timeout` seconds

    try:
        return input(prompt)
    finally:
        signal.alarm(0) # cancel alarm
Diese Ansätze bieten nicht blockierende Alternativen zu zeitlich begrenzten Benutzereingaben und sorgen für mehr Flexibilität und Kontrolle innerhalb Ihrer Python-Programme.

Das obige ist der detaillierte Inhalt vonWie kann ich zeitgebundene Benutzereingaben in Python implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn