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

Python 3.9如何实现按下指定按键时通过async函数修改全局变量

实现方案

前置依赖

  • 我们使用aioconsole实现异步键盘监听,避免阻塞asyncio事件循环,先执行安装:
    pip install aioconsole

改造思路

你原来的同步代码中time.sleep(10)是阻塞调用,会导致整个程序卡住无法响应键盘事件,所以需要做以下改造:

  1. 将主业务循环改造为异步协程,把阻塞的time.sleep替换为异步的asyncio.sleep
  2. 单独实现一个异步键盘监听协程,后台运行检测按键输入,匹配到指定按键后直接修改全局变量
  3. 用asyncio的gather方法同时运行两个协程,实现业务逻辑和按键监听并行

完整参考代码

import asyncio
import aioconsole
# 你的原有全局变量,按实际需求初始化
putHerosToWork = False
preventAFK = False
isClientConnected = True

# 这里为占位实现,替换为你原有代码的对应函数即可
def ConsoleLog(type, content):
    pass
def CheckConnection():
    pass
def CheckNewMapEvent():
    pass
def CheckTimeEvents():
    pass
def doPutHerosToWork():
    pass
def doPreventAFK():
    pass
def cls():
    pass

# 异步键盘监听协程
async def key_listener():
    global putHerosToWork, preventAFK
    while True:
        # 异步等待按键输入,不会阻塞事件循环
        key = await aioconsole.ainput()
        # 按下k键切换英雄工作功能开关
        if key.lower() == 'k':
            putHerosToWork = not putHerosToWork
            print(f"英雄工作功能已切换为: {'开启' if putHerosToWork else '关闭'}")
        # 按下p键切换防AFK功能开关,可按需求扩展其他按键
        elif key.lower() == 'p':
            preventAFK = not preventAFK
            print(f"防AFK功能已切换为: {'开启' if preventAFK else '关闭'}")
        await asyncio.sleep(0.1)

# 改造后的异步主业务循环
async def main_loop():
    global isClientConnected
    while True:
        ConsoleLog("NEWLINE", "")
        if putHerosToWork == False and preventAFK == False:
            ConsoleLog("BLANK", "")
            CheckConnection()
        if isClientConnected == True:
            CheckNewMapEvent()
            CheckTimeEvents()
            # Put Heros to Work
            if putHerosToWork == True:
                doPutHerosToWork()
            # Prevent AFK
            if preventAFK == True:
                doPreventAFK()
        # 替换原来的同步sleep为异步sleep
        await asyncio.sleep(10)
        cls()

async def main():
    # 同时运行主业务循环和键盘监听协程
    await asyncio.gather(
        main_loop(),
        key_listener()
    )

if __name__ == "__main__":
    asyncio.run(main())

注意事项

  • 协程内修改全局变量必须加global声明,否则会被识别为局部变量报错
  • 业务逻辑中如果有其他阻塞操作(比如网络请求、文件读写)也要对应替换为异步版本,否则会卡住事件循环导致按键不响应
  • 如果需要监听组合键或者不需要回车确认的热键,可以替换为keyboard库配合异步队列实现,核心逻辑不变

内容的提问来源于stack exchange,提问作者Iván S. Rodríguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:01