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

如何检测按键,实现耗时函数循环至按键按下后终止?

解决方案:用多线程+队列实现全局按键监听与函数循环控制

核心思路是把按键监听逻辑放到独立的后台线程中,将按键事件存入队列,主线程在每次函数执行完毕后检查队列,判断是否需要终止循环。这样即使函数运行时阻塞主线程,后台线程依然能捕获全局按键。

实现代码(基于keyboard模块)

首先确保安装keyboard模块:

pip install keyboard
import time
import queue
import threading
import keyboard

# 创建队列存储按键信号
key_queue = queue.Queue()

def long_running_func():
    time.sleep(10)
    print('函数执行完成')

def key_listener():
    # 全局监听q键,按下后向队列发送终止信号
    keyboard.wait('q')
    key_queue.put('terminate')

# 启动后台监听线程(守护线程:主线程结束时自动退出)
listener_thread = threading.Thread(target=key_listener, daemon=True)
listener_thread.start()

running = True
while running:
    long_running_func()
    # 检查队列是否有终止信号
    try:
        signal = key_queue.get(block=False)
        if signal == 'terminate':
            running = False
            print('收到终止信号,停止循环')
    except queue.Empty:
        # 队列无信号,继续执行下一轮函数
        pass

代码说明

  • queue.Queue作为线程间通信的媒介,后台线程捕获按键后向队列存入信号,主线程在函数执行间隙读取信号
  • key_listener线程通过keyboard.wait('q')阻塞等待目标按键,按下后立即向队列发送终止信号,设置为守护线程避免主线程结束后残留线程
  • 主线程每次执行完长耗时函数后,非阻塞式检查队列,确保不会因为等待信号而阻塞流程

扩展:监听多个按键

如果需要支持多个按键触发不同操作,可以修改监听线程为持续监听模式:

def key_listener():
    while True:
        event = keyboard.read_event()
        if event.event_type == keyboard.KEY_DOWN:
            if event.name == 'q':
                key_queue.put('terminate')
                break
            elif event.name == 'p':
                key_queue.put('pause')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:20:05