pygame.event.wait()未降CPU占用反而占满100%,求排查脚本错误
Pygame
event.wait()导致CPU占用100%的问题排查 最近我试着用pygame.event.wait()来降低脚本的CPU使用率——这个方法参考了Pygame官方文档,示例来自Stack Overflow的相关问答,但实际运行后完全没达到预期,CPU直接被占满到100%了。麻烦帮我排查下下面这段脚本里的错误:
import pygame from pygame.locals import * import threading def read_keyboard(): pygame.event.clear() while True: event = pygame.event.wait() # here we wait until user hits keyboard player_input = '' font = pygame.font.Font(None, 50) if event.type == KEYDOWN: if event.unicode == 'h': player_input = 'hello' elif event.type == QUIT: return read_keyboard_thread = threading.Thread(target = read_keyboard) pygame.init() screen = pygame.display.set_mode((480,360)) read_keyboard_thread.start()
问题根源分析
你的核心问题出在Pygame事件系统的线程安全限制上:
- Pygame的事件API(包括
event.wait())设计为只能在主线程中使用,子线程调用这些函数会触发不可预测的行为,其中就包括看似阻塞但实际后台忙等待的情况,直接导致CPU拉满。 - 另外你的主线程在启动子线程后没有任何阻塞或循环逻辑,会直接退出,这也会让Pygame的窗口管理陷入异常状态,进一步加剧资源占用问题。
修复后的代码
把事件处理逻辑移回主线程,同时优化资源创建(比如提前初始化字体),就能解决CPU占用问题:
import pygame from pygame.locals import * def handle_player_input(input_str): # 这里可以扩展处理输入后的业务逻辑 if input_str == 'hello': print("收到输入:hello") # 初始化Pygame pygame.init() screen = pygame.display.set_mode((480, 360)) # 提前初始化字体,避免每次事件循环重复创建浪费资源 font = pygame.font.Font(None, 50) # 主线程中运行事件循环(Pygame要求的标准做法) while True: # 这里的wait()会真正阻塞,直到有事件触发,CPU使用率会降到极低 event = pygame.event.wait() if event.type == KEYDOWN: if event.unicode == 'h': handle_player_input('hello') elif event.type == QUIT: # 退出前清理Pygame资源 pygame.quit() break
关键修复点说明
- 主线程处理事件:严格遵循Pygame的设计规范,事件循环必须放在主线程中,
pygame.event.wait()在这里会正常阻塞,不会占用额外CPU。 - 提前初始化资源:把字体创建移到循环外,避免重复创建对象带来的性能损耗。
- 正确退出流程:退出时调用
pygame.quit()清理所有Pygame资源,避免残留进程。
内容的提问来源于stack exchange,提问作者dmytro.poliarush
相关产品推荐
相关产品推荐

