考虑这个示例代码:
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
在主线程中修改后立即在线程内更新?
我尝试按照 @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()