0
我有一个简单的项目,我一次显示一个字母的消息,使用LED灯带和我的rpi。有时LED会随机点亮并卡住,直到显示新消息时被清除。简单的python多线程共享变量
我的解决方案是创建另一个线程,每2秒钟清除一次,所以如果LED随机打开,它们会很快关闭。
我显然不希望该线程在消息显示时清除显示,所以我创建了一个全局变量来跟踪当前是否显示消息。
这里的相关代码的精简版:
displaying = False
def display(msg):
global displaying
displaying = True
for c in msg:
turn_all_leds_off()
display_char(c)
time.sleep(1)
turn_all_leds_off()
time.sleep(.2)
time.sleep(1)
displaying = False
def listen_on_client():
while True:
global displaying
if not displaying:
get_new_messages_from_server_and_display_them()
time.sleep(2)
def clear_errors():
while True:
global displaying
if not displaying:
display(" ")
time.sleep(2)
t1 = Thread(target=listen_on_client, args=())
t2 = Thread(target=clear_errors, args=())
t1.start()
t2.start()
问题是,显示变量似乎并没有工作。当错误清除线程检查它时,程序的行为就好像显示始终为假。当我需要担心竞争条件时,我习惯于在其他编程语言中使用锁,但老实说,我只需要这个工作在几秒钟内,而不是纳秒。这不是一个竞争条件,似乎变量缓存在每个线程上,并且python没有volatile关键字。这与其他SO问题提出的做法类似,所以我不太清楚哪里出了问题。有任何想法吗?