시간 제한이 있는 사용자 입력: 솔루션 탐색
프로그래밍의 역동적인 세계에서는 사용자 입력에 시간 제한을 적용해야 하는 경우가 많습니다. . 사용자에게 질문을 제시하고 사용자가 응답해야 하는 시간을 제한하려는 시나리오를 생각해 보세요. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!