2017-10-16 48 views
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问题提出的做法类似,所以我不太清楚哪里出了问题。有任何想法吗?

回答

0

我已经在while循环中声明了全局变量,希望避免任何缓存,但这似乎确实有相反的效果。

改变一切从

def clear_errors(): 
    while True: 
     global displaying 

def clear_errors(): 
    global displaying 
    while True: 

固定它。不知道为什么。