Python实现带10秒超时限制的用户输入,超时后脚本无法停止如何解决?
问题排查与解决方法
问题根因
- 线程终止逻辑错误:Python 中
quit()、exit()方法仅作用于调用它的当前线程,无法终止整个进程。你在计时子线程中调用quit()只会停止该计时线程,主线程、输入子线程仍然会阻塞等待用户输入,导致脚本无法退出。 - 重复输入逻辑冗余:代码同时启动了
func2子线程执行输入,主线程末尾又单独执行了一次input(),同时存在两处阻塞等待输入的逻辑,逻辑冲突。 - 非必要依赖引入:使用pygame的Clock做计时完全没有必要,反而增加额外依赖,计时功能用Python标准库即可实现。
解决方案
方案1:最小改动修复现有代码
仅针对你现有代码的问题做修改,适配原有逻辑:
import pygame import os from threading import Thread clock = pygame.time.Clock() timee = 0 UIn=None is_input_finish = False def func1(): global timee global clock while not is_input_finish: milli = clock.tick() seconds = milli/1000 timee += seconds if int(timee) >= 10: print("\nTime is over") os._exit(0) # 直接终止整个进程 def func2(): global UIn, is_input_finish print("Working") UIn = input("Press key:\t") is_input_finish = True # 标记输入完成,停止计时线程 Thread(target=func1).start() Thread(target=func2).start()
改动说明:
- 导入
os模块,使用os._exit(0)替换quit(),直接终止整个进程 - 新增
is_input_finish标记,用户完成输入后自动停止计时线程,避免无意义的循环 - 删除主线程末尾多余的
input()调用,只保留一个输入逻辑 - 计时判断从
==10改为>=10,避免计时精度问题导致超时触发失败
方案2:无第三方依赖的跨平台简洁实现
完全去掉pygame依赖,用Python标准库threading.Timer实现,逻辑更清晰资源占用更低:
import os from threading import Timer UIn = None def time_out(): print("\nTime is over") os._exit(0) # 启动10秒定时器,超时后执行time_out函数 timer = Timer(10, time_out) timer.start() print("Working") UIn = input("Press key:\t") # 输入完成后取消定时器 timer.cancel() print(f"Input received: {UIn}")
方案3:Unix系系统专用的信号实现(无需杀进程)
如果是运行在Linux/macOS环境下,可以用系统信号实现超时打断,不需要直接终止整个进程,适配更复杂的业务场景:
import signal class TimeOutError(Exception): pass def time_out_handler(signum, frame): raise TimeOutError("Time is over") signal.signal(signal.SIGALRM, time_out_handler) signal.alarm(10) # 设置10秒闹钟 try: UIn = input("Press key:\t") signal.alarm(0) # 取消闹钟 print(f"Input received: {UIn}") except TimeOutError: print("\nTime is over")
该方案不支持Windows系统。
内容的提问来源于stack exchange,提问作者muhammed karolia
相关产品推荐
相关产品推荐

