Python 如何重写函数中的全局布尔值

Python 如何重写函数中的全局布尔值,python,Python,当用户输入'stop'时,我想使play=False停止音乐并在True时重复循环,我尝试使用global关键字,但由于某些原因,它不起作用。这里的明显问题是您使用的是多处理:不同进程中的工作人员不与父进程共享全局变量:它将“看到”另一个“play”变量实例 这是多处理和多线程之间的主要区别:在多线程中,全局变量是唯一的,一个线程中的更改在其他线程中可见。这有其自身的一系列问题,但在像这样的简单情况下,它只会起作用: 用threading.Thread替换那里的multi-processing.

当用户输入'stop'时,我想使
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()