Thread类中的变量未显示正确的输出(Python)

时间:2017-09-01 11:30:56

标签: python multithreading

我有一个类showAllThreads,它监视脚本中的所有现有线程(音乐播放器)

class showAllThreads(threading.Thread):

    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, *args, **kwargs)
        self.daemon = True
        self.start()

    #Shows whether the playing music is in queue, initially false
    musicQueue = False

    def run(self):
        while True:
            allThreads = threading.enumerate()
            for i in allThreads:
                if i.name == "PlayMusic" and i.queue == True:
                    musicQueue = True
                    print("Playlist is on")
                elif i.name == "PlayMusic" and i.queue == False:
                    musicQueue = False
                    print("Playlist is off")
                else:
                    musicQueue = False
            time.sleep(2)

当我尝试通过musicQueue allThreads.musicQueue访问来自主线程的allThreads = showAllThreads()时,False总是给我值musicQueue = True,即使while循环执行` expect -c " ` spawn sftp ${remote_user}@${remote_host} expect \"password\" send ${remote_pswd}\r expect sftp> send \" cd ${remote_path}\r \" expect sftp> send \" lcd ${source_path}\r \" expect sftp> send \" put ${source_file} \r \" expect sftp> send \" echo $? \r \" expect sftp> send \"bye\" " ' ` 。我知道播放列表已打开,因为打印命令成功完成。

1 个答案:

答案 0 :(得分:1)

你在两个地方定义“musicQueue”:首先在类级别(这使得它成为一个类属性 - 在类的所有实例之间共享的属性),然后作为{{1}中的局部变量} 方法。这是两个完全不同的名称,因此您不能指望分配给局部变量以任何方式更改类级别。

我认为你是Python新手并没有花时间去了解它的对象模型如何工作以及它与大多数主流OOPL的区别。如果你希望在Python中享受编码,你真的应该...

这里你想要的是run()一个实例变量,并在musicQueue内分配给它:

run()