Python中通过条件停止音频线程流的问题求助
Python中通过条件停止音频线程流的问题求助
嘿,我看了你的代码和需求,发现几个关键问题导致音乐线程没法被正常中断,咱们一步步来修复它!
首先先明确你的需求:
我有两个线程:一个播放音乐,一个接收输入。我希望当输入"r"时,音乐流能被这个条件中断。我知道用标志位的方式好像没起作用,请帮我修复这个代码。
你的原代码如下:
import pygame from threading import Event import threading import time def f_music(finish: Event): pygame.init() pygame.mixer.music.load("kukla-poet.mp3") pygame.mixer.music.play() while pygame.mixer.music.get_busy(): pygame.event.poll() if finish.is_set(): print('Finish') break def f_run(): while True: run = input("Vvedi deistvie") deistvie.append(run) print(run) if __name__ == "__main__": finish = Event() deistvie = [] music = threading.Thread(target=f_music, args=(finish, )) run = threading.Thread(target=f_run, args=()) music.start() run.start() while True: if deistvie[-1] == "r": finish.set() break
原代码存在的问题:
- 终止条件检测位置错误:
f_music里的if finish.is_set()和break都在while循环外面,这意味着只有音乐播放完之后才会检查终止信号,完全没法在播放过程中中断音乐 - 索引越界风险:主线程直接取
deistvie[-1],如果用户还没输入任何内容,这个操作会抛出IndexError - 未主动停止音乐:即使设置了
finish事件,也没有调用pygame的音乐停止方法,音乐还是会播放到结束
修复后的代码:
import pygame from threading import Event import threading import time def f_music(finish: Event): pygame.init() pygame.mixer.music.load("kukla-poet.mp3") pygame.mixer.music.play() # 在播放循环内部持续检测终止信号 while pygame.mixer.music.get_busy() and not finish.is_set(): pygame.event.poll() # 加个小延迟,避免占用过多CPU time.sleep(0.1) # 如果是因为终止信号退出,主动停止音乐并提示 if finish.is_set(): pygame.mixer.music.stop() print('音乐已中断') def f_run(deistvie: list): while True: run = input("Vvedi deistvie: ") deistvie.append(run) print(f"你输入了: {run}") if __name__ == "__main__": finish = Event() deistvie = [] # 把deistvie作为参数传给f_run,更规范 music_thread = threading.Thread(target=f_music, args=(finish, )) input_thread = threading.Thread(target=f_run, args=(deistvie, )) music_thread.start() input_thread.start() while True: # 先判断列表非空,再检查最后一个输入 if deistvie and deistvie[-1] == "r": finish.set() print("已触发终止信号") break # 同样加个延迟,减少主线轮询的CPU占用 time.sleep(0.1) # 等待线程结束 music_thread.join() input_thread.join() pygame.quit()
关键修改点说明:
- 把终止检测移到循环内部:修改
while循环条件,每次循环都检查finish事件是否被设置,一旦设置就退出循环 - 主动停止音乐:当检测到终止信号时,调用
pygame.mixer.music.stop()立刻停止音乐播放 - 避免索引错误:主线程中先判断
deistvie是否非空,再检查最后一个输入内容 - 添加延迟减少CPU占用:在循环中加入
time.sleep(0.1),避免线程一直占用CPU资源 - 线程参数传递更规范:把
deistvie作为参数传给f_run,而不是用全局变量,代码更清晰 - 线程收尾处理:主线程中调用
join()等待子线程结束,最后调用pygame.quit()清理资源
这样修改后,当你输入"r"时,音乐就会立刻中断啦!
备注:内容来源于stack exchange,提问作者Кирилл Маликов
相关产品推荐
相关产品推荐

