【问题标题】:Non-blocking infinite loop非阻塞无限循环
【发布时间】: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


【解决方案1】:

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

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多