【发布时间】: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