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

不使用并发消除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:22:48