如何在Python倒计时结束后终止用户输入函数运行?
问题分析与修复方案
原代码的几个致命问题
- 线程启动方式错误:
Thread(target=countTime(5))直接执行了countTime(5)并把结果传给target,等于计时逻辑在主线程同步跑完,完全没用到多线程的异步效果。正确做法是传递函数本身,参数用args传入。 - 全局变量冲突:
timeOut、start_time都是全局变量,三个block的线程会同时修改这些值,导致计时和输入逻辑彻底混乱——比如第一个block刚把timeOut设为False,第二个block的计时又立刻改回True,输入线程根本不知道该停还是继续。 - 输入阻塞卡死:
input()是阻塞式调用,哪怕超时标志变False,只要用户没输入,这个函数就一直卡在那里,循环无法退出。 - 变量重复定义:
block_list在全局被定义了两次,后面的定义会覆盖前面的,导致之前存储的数据直接丢失。
修复后的代码
from threading import Thread import time # 存储所有轮次的输入结果,每一轮对应一个子列表 block_results = [] def main(): for block_num in range(3): print(f"\n=== 第 {block_num+1} 轮输入,限时5秒 ===") # 用列表作为超时标志(列表是可变对象,线程间可共享修改) is_timeout = [True] current_inputs = [] # 启动输入线程,传入当前轮的存储列表和超时标志 input_thread = Thread(target=get_user_inputs, args=(current_inputs, is_timeout)) input_thread.daemon = True # 主线程结束时自动销毁该线程,避免卡住 input_thread.start() # 启动计时线程 timer_thread = Thread(target=count_down, args=(5, is_timeout)) timer_thread.start() # 等待计时线程结束 timer_thread.join() # 保存当前轮的输入结果 block_results.append(current_inputs) print(f"第 {block_num+1} 轮输入的数字: {current_inputs}") def get_user_inputs(input_list, is_timeout): while is_timeout[0]: try: user_input = input("输入数字按回车: ") # 只有未超时的输入才会被添加 if is_timeout[0]: input_list.append(int(user_input)) except ValueError: print("请输入有效数字!") def count_down(seconds, is_timeout): start_time = time.time() # 每隔0.1秒检查一次,避免空转浪费CPU资源 while time.time() - start_time < seconds: time.sleep(0.1) print("\n时间到!停止输入") is_timeout[0] = False if __name__ == "__main__": main() print("\n所有轮次结果汇总:", block_results)
关键修改说明
- 线程启动改为
Thread(target=count_down, args=(5, is_timeout)),确保计时逻辑在子线程异步执行。 - 每轮使用独立的
is_timeout标志和current_inputs列表,彻底避免全局变量的互相干扰。 - 给输入线程设置
daemon=True,主线程结束时会自动终止输入线程,不会因为input()阻塞导致程序挂起。 - 计时函数中加入
time.sleep(0.1),减少循环轮询频率,降低CPU占用。 - 输入时先检查超时标志,超时后输入的内容不会被添加到结果列表中。
内容的提问来源于stack exchange,提问作者Treeflowers
相关产品推荐
相关产品推荐

