【问题标题】:Simple python multithreading shared variable简单的python多线程共享变量
【发布时间】:2017-10-16 15:19:06
【问题描述】:

我有一个简单的项目,我使用带有 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()

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

【问题讨论】:

    标签: python multithreading python-2.7


    【解决方案1】:

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

    改变一切

    def clear_errors():
        while True:
            global displaying
    

    def clear_errors():
        global displaying
        while True:
    

    修复它。不知道为什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2018-08-28
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多