当前位置: 首页 > 知识库问答 >
问题:

无阻塞无限循环

卫沈义
2023-03-14

我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在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获得更新/升级-ed)。我也尝试过在程序中移动循环,但是无论我把它放在哪里,它都会阻塞一切。

  • 我在寻找的是非阻塞(无限)循环吗
  • 这就是游戏/事件循环吗
  • 我可以不使用多个线程解决这个问题吗(只是好奇,如果必须的话,这不是一个限制)
  • 这是“设计”无限循环的一般问题吗
  • 我能把这当作一个(反面)吗比赛条件?我在考虑可能使用信号灯作为某种工具来阻止,但我不确定

共有1个答案

公孙向荣
2023-03-14

我用一个全局变量解决了这个问题:

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()
 类似资料:
  • 问题内容: 我习惯从X开始评估我的。在我中,我使用启动我的窗口管理器。现在,如果我杀死了我的WM(为了测试其他WM),X也将终止,因为脚本到达了EOF。所以我在我的末尾添加了这个: 这样,如果我杀死WM,X不会终止。现在我的问题是:我该如何 无限睡眠 而不是循环睡眠?是否有一个类似于冻结脚本的命令? 最好的祝福 问题答案: 完全按照建议进行操作,并且不会虐待猫。

  • 问题内容: 正如我从golang文档中了解到的,如果我使用8个内核的cpu(intel i7)设置runtime.GOMAXPROCS(8),然后启动无限循环goroutine,则不应阻塞其他gorutine,因为有足够的线程和goprocs。但是,当使用net / http包时,情况并非如此,无限循环goroutine会在几次调用后阻塞http服务器。谁能帮助解释原因? 如果我注释“无限循环”这

  • 问题内容: 有没有一种方法可以执行不冻结浏览器的同步AJAX查询?在我看来,在大多数情况下,同步请求要容易得多,但是它们阻止了代码其他部分的执行,这是一个真正的杀手。有没有办法获得同步AJAX而没有负面影响?(是的,我意识到术语“同步AJAX”是矛盾的。) 问题答案: 在即将到来的ECMAScript 2016(ES7)标准中,提供了一组新的语言关键字,这些关键字旨在执行与您似乎正在寻找的目标非常

  • 我正在尝试构建一个worker verticle,通过采用kotlin的PubSub示例,结合这个关于worker无限阻塞循环处理的答案,将Google cloud PubSub主题订阅与vert.x的事件总线连接起来。 它确实有效,但Vert. X在收到来自PubSub的消息后的某个时间通过抛出异常来不断唠叨的日志(请暂时忽略阻止初始化): 这是源代码: 我显然错过了一些东西。此外,如果您有更好

  • 这是一个非阻塞的解决方案,但看起来并不那么优雅。它能以某种方式改进/简化吗?

  • 在上一节中,我们看到了 take Effect 让我们可以在一个集中的地方更好地去描述一个非常规的流程。 重温一下登录流程示例: function* loginFlow() { while(true) { yield take('LOGIN') // ... perform the login logic yield take('LOGOUT') // ...