Python持续循环CPU占用过高优化及代码改进咨询
问题
我的Python代码能正常运行,但CPU占用过高,排查后发现是无限while循环导致的。想找低CPU占用的持续循环方案,也欢迎对现有代码的操作逻辑提改进建议。我试过用asyncio事件循环,但效果不好。现有代码如下:
from selenium import webdriver import pyautogui import time import keyboard from selenium.webdriver.chrome.options import Options chrome_options = Options() browser = webdriver.Chrome(options=chrome_options) browser.get("https://animeisrael.website/watch/fulllink/op/fulllinkop-268.php") browser.fullscreen_window() me = 268 while True: if keyboard.is_pressed('l'): browser.close() me+=1 hello = str(me) browser = webdriver.Chrome(options=chrome_options) browser.get("https://animeisrael.website/watch/fulllink/op/fulllinkop-"+hello+".php") browser.fullscreen_window() time.sleep(2) pyautogui.doubleClick(960,648) time.sleep(1) pyautogui.click(960,648) pyautogui.press('f')
解决方案
一、解决CPU占用高的核心:用阻塞式按键监听替代轮询循环
原来的while True一直循环检查按键状态,会让CPU持续处于高负载。改成等待按键触发再执行逻辑的模式,程序在无操作时会进入休眠状态,CPU占用几乎为0。可以用keyboard库的add_hotkey或wait方法实现,无需自己写死循环。
二、操作逻辑优化建议
- 复用浏览器实例:每次关闭再重启浏览器不仅耗时,还浪费系统资源,直接在当前窗口加载新URL即可。
- 替换PyAutoGUI操作:依赖屏幕坐标的点击逻辑不稳定,换用Selenium直接操作网页元素,适配不同分辨率和窗口状态。
- 规范变量命名:比如把
me改成current_episode,hello改成episode_url,提升代码可读性。 - 添加异常处理:避免加载网页或操作元素时出错导致程序崩溃。
优化后的代码示例
from selenium import webdriver import keyboard from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器配置 chrome_options = Options() # 可选:添加无头模式(不显示浏览器窗口) # chrome_options.add_argument("--headless=new") # 只启动一次浏览器 browser = webdriver.Chrome(options=chrome_options) browser.fullscreen_window() current_episode = 268 def load_next_episode(): global current_episode current_episode += 1 # 用f-string拼接URL更简洁 episode_url = f"https://animeisrael.website/watch/fulllink/op/fulllinkop-{current_episode}.php" # 直接在当前浏览器加载新剧集 browser.get(episode_url) browser.fullscreen_window() try: # 等待播放按钮加载完成再点击(请根据实际网页调整元素选择器) play_button = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "button.play-btn")) ) play_button.click() # 用JS实现视频全屏,替代按F键的操作 browser.execute_script("document.querySelector('video').requestFullscreen();") except Exception as e: print(f"加载剧集出错: {e}") # 绑定L键,按下即触发下一集加载 keyboard.add_hotkey('l', load_next_episode) # 按ESC键退出程序,保持主进程运行 keyboard.wait('esc') # 退出时关闭浏览器 browser.quit()
代码说明
- 低CPU占用:通过
add_hotkey绑定快捷键,只有触发按键时才执行逻辑,平时程序处于休眠状态。 - 资源高效利用:浏览器仅启动一次,每次加载新剧集直接跳转URL,节省启动时间和系统资源。
- 操作稳定性提升:用Selenium等待网页元素,避免PyAutoGUI依赖屏幕坐标的不确定性。
- 可控退出机制:按ESC键可正常关闭浏览器并终止程序,无需强制结束进程。
内容的提问来源于stack exchange,提问作者roi
相关产品推荐
相关产品推荐

