无阻塞无限循环

时间:2017-10-15 23:20:39

标签: python loops raspberry-pi blocking nonblocking

我有一个带有Sense帽子的Raspberry pi。我已经制作了一个binary clock,我希望在Sense hat的显示屏上显示并保持更新。但是,我希望能够使用操纵杆中间来打开和关闭时钟。一切正常,除了我的时钟更新循环阻止任何新输入一旦开始。

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)。我也试过在程序中移动循环,但无论我放在哪里都会阻塞所有内容。

  • 这是我正在寻找的非阻塞(无限)循环吗?
  • 这是游戏/事件循环吗?
  • 我可以使用多个线程来解决这个问题(只是好奇,如果必须的话,不是限制)?
  • 这是“设计”无限循环的一般问题吗?
  • 我可以将此视为(反向?)竞争条件吗?我在考虑使用信号量作为某种不阻挡的工具,但我不确定。

2 个答案:

答案 0 :(得分:0)

您需要的是多线程。在这里,您可以通过示例找到一个很好的解释。

How to use threading in Python?

答案 1 :(得分:0)

我通过使用全局变量解决了它:

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()
相关问题