You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python倒计时结束后终止用户输入函数运行?

问题分析与修复方案

原代码的几个致命问题

  1. 线程启动方式错误:Thread(target=countTime(5)) 直接执行了countTime(5)并把结果传给target,等于计时逻辑在主线程同步跑完,完全没用到多线程的异步效果。正确做法是传递函数本身,参数用args传入。
  2. 全局变量冲突:timeOut、start_time都是全局变量,三个block的线程会同时修改这些值,导致计时和输入逻辑彻底混乱——比如第一个block刚把timeOut设为False,第二个block的计时又立刻改回True,输入线程根本不知道该停还是继续。
  3. 输入阻塞卡死:input()是阻塞式调用,哪怕超时标志变False,只要用户没输入,这个函数就一直卡在那里,循环无法退出。
  4. 变量重复定义: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:01:02