【发布时间】:2018-03-27 10:10:16
【问题描述】:
我有一个带有 Sense 帽子的 Raspberry pi。我制作了一个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
我一直在思考如何解决这个问题。如何让脚本/时钟继续运行并仍然接受来自操纵杆的新动作。但是一旦while循环开始,我就卡住了。我不知道谷歌是为了什么。我已经开始研究 async/await,但这似乎是 Python 3.5+ 的功能,而我的 pi 只有 2.7.9/3.4.2(我只是 sudo apt-get update/upgrade-ed)。我也试过在程序中移动循环,但无论我把它放在哪里,它都会阻塞一切。
- 我正在寻找一个非阻塞(无限)循环吗?
- 这就是游戏/事件循环吗?
- 我可以在不使用多个线程的情况下解决这个问题吗(只是好奇,如果必须的话,不是限制)?
- 这是“设计”无限循环中的普遍问题吗?
- 我可以将其视为(反向?)竞争条件吗?我在考虑是否可以使用信号量作为不阻塞的某种工具,但我不确定。
【问题讨论】:
-
查看 Python 的
signal库 -
@PeterWood 我在看
signal,但认为这太过分了,而且主要是操作系统的东西。但是,我不确定如何确定操纵杆发送的信号类型(如果有)。我将如何确定这一点?
标签: python loops raspberry-pi blocking nonblocking