简单的python多线程共享变量

时间:2017-10-16 15:19:06

标签: python multithreading python-2.7

我有一个简单的项目,我使用带有rpi的LED灯条一次显示一个字母的消息。有时LED会随机点亮并卡住,直到显示新信息时它被清除。

我的解决方案是创建另一个线程,每隔~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()

问题是,显示变量似乎不起作用。当错误清除线程检查时,程序的行为就像显示始终为false。当我需要担心竞争条件时,我习惯不得不在其他编程语言中使用锁,但老实说,我只需要按秒的顺序工作,而不是纳秒。这不是竞争条件,似乎变量缓存在每个线程上,而python没有volatile关键字。这类似于其他SO问题的建议,所以我不太确定是什么问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

改变一切
def clear_errors():
    while True:
        global displaying

def clear_errors():
    global displaying
    while True:

修好了。不知道为什么会这样。