不同数据类型的Python成员变量在具有相同优先级的不同线程中未得到更新

问题描述 投票:0回答:1

考虑这个示例代码:

class Test:
    def __init__(self) -> None:
        self.bool = False
        self.string = ""
        thread = Thread(target = self.target)
        thread.start()

    def target(self):
        while True:
            if self.bool:
                print("Bool changed")
                break

            if self.string != "":
                print("String changed")
                break
    
    def changeBool(self):
        self.bool = True
    
    def changeString(self):
        self.string = "sample"

var = Test()
var.changeString()
var.changeBool()

在这里,我在一个类中有两个成员变量:一个布尔值和一个字符串。在构造函数中,我启动一个新线程来运行一个函数,该函数基本上告诉我两个变量中的哪一个首先在线程内被修改。

当我运行这个程序时,即使我先调用

changeString()
,输出始终是“Boolchanged”。这意味着布尔值在线程内的更新速度比字符串更快。为什么会出现这种情况?如何确保
self.bool
在主线程中修改后立即在线程内更新?

python multithreading class asynchronous member
1个回答
0
投票

我尝试按照 @Wombatz 的建议实现线程安全队列,并且成功了。这是修改后的代码:

class Test:
    def __init__(self) -> None:
        self.queue = queue.Queue()
        thread = Thread(target = self.target)
        thread.start()

    def target(self):
        while True:
            try:
                message = self.queue.get_nowait()
                if message[0] == "bool":
                    print(f"Bool changed to {message[1]}")
                    break

                if message[0] == "string":
                    print(f"String changed to {message[1]}")
                    break
            except queue.Empty: pass
    
    def changeBool(self):
        self.queue.put(("bool", True))
    
    def changeString(self):
        self.queue.put(("string", "hello"))

var = Test()
var.changeBool()
var.changeString()
© www.soinside.com 2019 - 2024. All rights reserved.