不使用并发消除while循环阻塞性:音频文本同步输出问题
解决playsound与文本输出同步循环运行的问题
核心问题分析
你当前的代码存在两个关键问题:
- 单线程循环里的
time.sleep(18)会完全阻塞文本输出,导致文本和音乐无法真正同步 - 直接重复调用
block=False的playsound,可能因资源未及时释放产生嗡嗡声,且播放时机和文本输出不同步
解决方案:用多线程分离任务
把音乐播放和文本输出放到不同线程中,让两者各自独立循环运行,互不阻塞。同时通过线程事件控制程序退出,处理键盘中断。
修改后的代码
import random import time import sys import threading from termcolor import colored from playsound import playsound # 控制线程停止的事件 stop_event = threading.Event() def play_music_loop(): music_path = "/home/AruJ/Downloads/loremipsum.mp3" while not stop_event.is_set(): # 用block=True播放,播放完成后再循环,避免资源泄漏 playsound(music_path, block=True) def print_text_loop(): while not stop_event.is_set(): letter = random.choice(["a", "b"]) color = random.choice(["green", "blue"]) print(colored(letter, color)) # 按需调整文本输出间隔,不会阻塞音乐播放 time.sleep(0.1) if __name__ == "__main__": # 启动音乐线程 music_thread = threading.Thread(target=play_music_loop) music_thread.daemon = True music_thread.start() # 启动文本输出线程 text_thread = threading.Thread(target=print_text_loop) text_thread.daemon = True text_thread.start() # 等待键盘中断(Ctrl+C) try: while True: time.sleep(1) except KeyboardInterrupt: stop_event.set() print("\n程序已停止") sys.exit(0)
代码说明
- 多线程分离:音乐播放和文本输出各占一个独立线程,互相不阻塞,实现真正的同步运行
- 解决嗡嗡声问题:音乐线程用
block=True播放,每次播放完成后再进入下一次循环,避免重复调用block=False导致的资源泄漏 - 优雅退出:通过
stop_event事件统一通知所有线程停止,配合键盘中断实现程序正常退出 - 灵活调整:文本输出的间隔可按需修改,不会影响音乐的循环播放
额外优化建议
如果playsound仍存在兼容性问题,可改用pygame库播放音乐,它的资源管理更稳定:
# 替换playsound的音乐播放函数 import pygame def play_music_loop(): pygame.mixer.init() pygame.mixer.music.load("/home/AruJ/Downloads/loremipsum.mp3") pygame.mixer.music.play(-1) # -1表示无限循环播放 while not stop_event.is_set(): time.sleep(1) pygame.mixer.music.stop()
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

