Python 如何重写函数中的全局布尔值
当用户输入'stop'时,我想使Python 如何重写函数中的全局布尔值,python,Python,当用户输入'stop'时,我想使play=False停止音乐并在True时重复循环,我尝试使用global关键字,但由于某些原因,它不起作用。这里的明显问题是您使用的是多处理:不同进程中的工作人员不与父进程共享全局变量:它将“看到”另一个“play”变量实例 这是多处理和多线程之间的主要区别:在多线程中,全局变量是唯一的,一个线程中的更改在其他线程中可见。这有其自身的一系列问题,但在像这样的简单情况下,它只会起作用: 用threading.Thread替换那里的multi-processing.
play=False
停止音乐并在True时重复循环,我尝试使用global
关键字,但由于某些原因,它不起作用。这里的明显问题是您使用的是多处理
:不同进程中的工作人员不与父进程共享全局变量:它将“看到”另一个“play”变量实例
这是多处理和多线程之间的主要区别:在多线程中,全局变量是唯一的,一个线程中的更改在其他线程中可见。这有其自身的一系列问题,但在像这样的简单情况下,它只会起作用:
用threading.Thread
替换那里的multi-processing.Process
,它就可以工作了。但是请注意,您的工作线程将仅在歌曲结束时检查变量,它将跳到下一首歌曲(或者更确切地说,代码的方式是,当它将从同一首歌曲开始时)
如果您真的想修复它,请检查Queue
类的使用情况(有多线程、异步和多处理版本),并使用这些类来控制工作进程,包括发送下一首歌曲播放的路径
此外,如果您想中途停止一首歌曲,这看起来很合理,那么您应该坚持多处理:然后通过向其发送kill信号来停止该过程-不可能以相同的方式停止线程:一旦Python将控制权交给
playsound
call,您必须等待它变成芬兰语。(但我怀疑playsound库在其他调用中有更细粒度的控件,而不是在playsound.playsound
中,这样一首歌就可以暂停/恢复/停止而不终止进程-哦,天哪!用谷歌搜索文档,它实际上没有任何控件-因此远程杀戮可以工作)不相关,但{name:name的索引,枚举中的索引(os.listdir(loc))}
看起来您的名称和索引是向后的。另外,进程不共享全局变量。您使用的是两个不同的进程,进程不共享状态。每个进程都在自己的内存空间中运行,因此一般来说,它们之间不能共享全局变量。但是在Python 3.8中添加了一个类,因此您可以使用t、 没有办法阻止playsound
模块播放声音,因此不管其他任何事情,简单地设置一个标志都不会起作用。你需要使用一个更好的音频模块来做你想做的事情。我认为有一个是pygame
。
from playsound import playsound
import os
from multiprocessing import Process
def play_song(song_index, loc, song_list):
global play
while play:
try:
playsound(fr'{loc}\{song_list[song_index]}')
except Exception as e:
print(f'Error: {e}')
break
def controls(input):
global play
if input == 'stop':
play = False
print('stopped')
play = True
if __name__ == '__main__':
while True:
user = input('Enter folder name [Desktop]:\n>> ')
loc = fr'{os.environ["USERPROFILE"]}\Desktop\{user}'
music_dict = {name: index for name, index in enumerate(os.listdir(loc))}
for index in music_dict:
print(f'{index}) {music_dict[index]}')
choice = int(input(f'Play song[1-{index}]:\n>> '))
p1 = Process(target=play_song, args=(choice, loc, music_dict))
p1.start()
control = str(input('>> ')).lower()
p2 = Process(target=controls, args=(control,))
p2.start()
p1.join()
p2.join()