Python에서 시간 제한 사용자 입력을 어떻게 구현할 수 있나요?

Susan Sarandon
풀어 주다: 2024-11-27 07:43:16
원래의
400명이 탐색했습니다.

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

시간 제한이 있는 사용자 입력: 솔루션 탐색

프로그래밍의 역동적인 세계에서는 사용자 입력에 시간 제한을 적용해야 하는 경우가 많습니다. . 사용자에게 질문을 제시하고 사용자가 응답해야 하는 시간을 제한하려는 시나리오를 생각해 보세요. Python에서 이 작업을 수행하는 것은 간단해 보일 수 있지만 고유한 과제가 있습니다.

한 가지 접근 방식은 threading 모듈을 활용하는 것입니다. Timer 객체를 생성하고 지속 시간을 설정하면 카운트다운을 시작할 수 있습니다. 이 기간 동안 코드는 차단된 상태로 유지되어 사용자 입력을 기다립니다. 응답을 받기 전에 시간이 만료되면 적절한 메시지가 표시될 수 있습니다. 아래 코드 조각은 이 접근 방식을 보여줍니다.

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()
로그인 후 복사

그러나 이 방법에는 한계가 있습니다. 메인 스레드를 차단하면 프로그램 내의 다른 작업 실행이 방해받을 수 있습니다. 따라서 비차단 작업을 허용하는 대체 접근 방식이 필요해졌습니다.

OS 관련 솔루션

Windows 시스템의 경우 msvcrt 키보드 입력을 위한 저수준 인터페이스를 제공하는 모듈입니다. 지정된 시간 제한을 초과하면 TimeoutExpired 예외가 발생하여 이에 따라 상황을 처리할 수 있습니다. 구현은 다음과 같습니다.

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 기반 개선

Unix 계열 시스템에서는 select 모듈을 탐색할 수 있습니다. 이를 통해 파일 설명자를 모니터링하고 지정된 시간 내에 키보드 입력을 포함하여 지정된 이벤트를 기다릴 수 있습니다. 다음 코드 조각은 이 기술을 예시합니다.

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
로그인 후 복사

또는 signal 모듈을 사용할 수도 있습니다. 타이머를 설정하고 결과 SIGALRM 신호를 처리하여 사용자 입력에 시간 제약을 가할 수 있습니다. 방법은 다음과 같습니다.

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
로그인 후 복사

이러한 접근 방식은 시간 제한이 있는 사용자 입력에 대한 비차단 대안을 제공하여 Python 프로그램 내에서 더 많은 유연성과 제어 기능을 제공합니다.

위 내용은 Python에서 시간 제한 사용자 입력을 어떻게 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿