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

Python 3.10脚本线程阻塞问题:实现循环与键盘监听并发并按q退出

问题分析与修复

你的代码存在三个核心问题,导致主线程被阻塞、程序无法按预期终止:

  1. join()阻塞主线程:keyboard_listener.join()会强制主线程等待监听线程结束,但pynput的Listener是持续运行的后台线程,这直接导致后续的while循环永远无法执行。
  2. 局部变量覆盖全局变量:on_key_press函数里的exit_time = True会创建一个局部变量,根本不会修改全局的exit_time终止标记。
  3. 缺少sleep依赖:代码中使用了sleep(1)但未导入time模块,运行时会抛出NameError。

修复后的代码

#!/usr/bin/python3

import threading
import sys
import time  # 导入time模块,用于sleep
from pynput import keyboard

exit_time = False

def on_key_press(key):
    global exit_time  # 声明使用全局变量exit_time
    try:
        k = key.char
    except AttributeError:  # 捕获特定异常,避免裸except
        k = key.name
    if k == 'q':
        exit_time = True
        return False  # 返回False让Listener线程主动停止

print("Press q to close.")

# 创建监听线程并设为守护线程,主线程结束时自动退出
keyboard_listener = keyboard.Listener(on_press=on_key_press)
keyboard_listener.daemon = True
keyboard_listener.start()

# 主线程执行业务循环
while not exit_time:
    time.sleep(1)
    # 这里可以添加你的业务逻辑代码
    print("主线程运行中...")

print("Goodbye")
sys.exit(0)

关键修改说明

  • 移除keyboard_listener.join(),让主线程能继续执行后续的while循环
  • 在on_key_press中添加global exit_time,确保修改的是全局终止标记
  • 导入time模块,解决sleep未定义的问题
  • 将监听线程设为守护线程,确保主线程退出时子线程自动终止
  • 按下q时返回False,主动停止监听线程以释放资源
  • 替换裸except为AttributeError,避免捕获无关异常增加调试难度

内容的提问来源于stack exchange,提问作者BowPark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:26:01