【问题标题】:Simple python curses-application uses 100% CPU while running. Is this normal?简单的 python curses-application 在运行时使用 100% CPU。这是正常的吗?
【发布时间】:2013-03-28 16:11:45
【问题描述】:

我正在构建这个简单的应用程序,我注意到当 curses 运行时,“top”中的 CPU 负载是 100%.. 这似乎很糟糕。谁能解释一下?

def Run(self, stdscr):

    self.screen = stdscr

    curs_set(0)
    self.screen.nodelay(1)
    self.y_max = self.screen.getmaxyx()[0]
    self.x_max = self.screen.getmaxyx()[1] 

    for e in self.Inv:
        self.Create_Win(self.Inv.index(e), e)

    self.test_win = self.screen.derwin(1, self.x_max, 10, 0)
    self.test_win.addstr(self.TargetDict["Target_1"]["Obj"].Name)

    running = True
    while running:
        self.screen.refresh()
        q = self.screen.getch()


        #Press q to exit program
        if q == ord("q"):
            running = False

这是程序运行时的样子。一旦我用“q”终止程序,它就会恢复正常。

【问题讨论】:

    标签: python load curses python-curses


    【解决方案1】:

    问题是对getch 的调用没有阻塞,所以程序不断循环通过while 循环。来自getch documentation

    获得一个角色。请注意,返回的整数不必在 ASCII 范围内:功能键、键盘键等返回大于 256 的数字。在无延迟模式下,如果没有输入,则返回 -1,否则 getch() 等待直到按下了一个键。

    你的程序在循环之前设置nodelay

    self.screen.nodelay(1)
    

    【讨论】:

    • 啊,我明白了。是的,如果我关闭它,问题就会消失。吃掉所有可用的 CPU 似乎很疯狂。我记得在某个地方看到过一些类似的东西,它需要一个时间值,它在继续循环之前等待输入.. 不记得它的名字了.. 我不得不谷歌一下(除非你知道?)
    • 一种常见的模式是为阻塞函数提供超时参数,但不幸的是getch 不允许您进行超时。您可以尝试类似 docs.python.org/2/library/time.html#time.sleep 之类的方法,尽管这通常不是构建代码的最佳方式 - 而且 sleep 无论如何也不是这里的答案,因为 1 秒可能等待时间太长。
    • 我想到的函数是halfdelay(tenthsofsecond),虽然我现在不能让它工作..
    • FWIW,您可能需要小心 halfdelay - 特别是在紧密循环中 - 因为根据文档,它会在超时时引发异常。
    • 我认为最好的解决方案是使用window.timeout(delay_ms) 方法来设置getch 输入超时,以毫秒为单位。没有要处理的异常。
    【解决方案2】:

    需要nodelay(True)的地方,使用内置的睡眠功能

    curses.napms(10)
    

    在 while 循环结束时,限制您的 FPS。 数字以毫秒为单位,因此例如 10ms,应该以 100FPS 刷新循环。

    在我的练习游戏中,此解决方案将 CPU 使用率降至几乎 0%,而对响应速度没有明显影响。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多