非阻塞无限循环
Non-blocking infinite loop
我有一个 Raspberry pi 带 Sense 帽子。我制作了一个 binary clock,我想在 Sense 帽子的显示屏上显示并保持更新。但是,我希望能够使用操纵杆中间打开和关闭时钟。一切正常,除了我的时钟的更新循环在启动后会阻止任何新输入。
from sense_hat import SenseHat
from signal import pause
def show_clock():
# clock-logic
def pushed_middle(event):
while 1:
show_clock()
sense = SenseHat()
sense.stick.direction_middle = pushed_middle
pause
我一直在想怎么解决这个问题。如何让 script/clock 保持 运行 并仍然接受来自操纵杆的新操作。但是一旦 while 循环开始,我就卡住了。我不确定要 google 做什么。我已经开始研究 async/await,但这似乎是 Python 3.5+ 的功能,而我的 pi 只有 2.7.9/3.4.2(我只是 sudo apt-get update/upgrade
-ed) .我也试过在程序中移动循环,但无论我把它放在哪里,它都会阻止一切。
- 我要找的是非阻塞(无限)循环吗?
- 这就是game-/event-loop吗?
- 我可以不使用多线程来解决这个问题吗(只是好奇,如果必须的话不是限制)?
- 这是 "designing" 无限循环中的普遍问题吗?
- 我可以将其视为(反向?)竞争条件吗?我在考虑是否可以使用信号量作为某种不阻塞的工具,但我不确定。
我用全局变量解决了:
from sense_hat import SenseHat
from signal import pause
def show_clock():
global clock_is_on
while clock_is_on: # clock-loop
# clock-logic
# ...
events = sense.stick.get_events()
for event in events:
if event.direction == "middle" and event.action == "pressed":
clock_is_on = False
time.sleep(1) # only need to update clock once every second
def pushed_middle(event):
if not clock_is_on:
clock_is_on = True
show_clock()
sense = SenseHat()
clock_is_on = False
sense.stick.direction_middle = pushed_middle
pause()
我有一个 Raspberry pi 带 Sense 帽子。我制作了一个 binary clock,我想在 Sense 帽子的显示屏上显示并保持更新。但是,我希望能够使用操纵杆中间打开和关闭时钟。一切正常,除了我的时钟的更新循环在启动后会阻止任何新输入。
from sense_hat import SenseHat
from signal import pause
def show_clock():
# clock-logic
def pushed_middle(event):
while 1:
show_clock()
sense = SenseHat()
sense.stick.direction_middle = pushed_middle
pause
我一直在想怎么解决这个问题。如何让 script/clock 保持 运行 并仍然接受来自操纵杆的新操作。但是一旦 while 循环开始,我就卡住了。我不确定要 google 做什么。我已经开始研究 async/await,但这似乎是 Python 3.5+ 的功能,而我的 pi 只有 2.7.9/3.4.2(我只是 sudo apt-get update/upgrade
-ed) .我也试过在程序中移动循环,但无论我把它放在哪里,它都会阻止一切。
- 我要找的是非阻塞(无限)循环吗?
- 这就是game-/event-loop吗?
- 我可以不使用多线程来解决这个问题吗(只是好奇,如果必须的话不是限制)?
- 这是 "designing" 无限循环中的普遍问题吗?
- 我可以将其视为(反向?)竞争条件吗?我在考虑是否可以使用信号量作为某种不阻塞的工具,但我不确定。
我用全局变量解决了:
from sense_hat import SenseHat
from signal import pause
def show_clock():
global clock_is_on
while clock_is_on: # clock-loop
# clock-logic
# ...
events = sense.stick.get_events()
for event in events:
if event.direction == "middle" and event.action == "pressed":
clock_is_on = False
time.sleep(1) # only need to update clock once every second
def pushed_middle(event):
if not clock_is_on:
clock_is_on = True
show_clock()
sense = SenseHat()
clock_is_on = False
sense.stick.direction_middle = pushed_middle
pause()