Python 诅咒 : Exiting a program fast

标签 python ncurses python-curses

快速退出带有使用curses模块的无限循环的Python程序的最佳方法是什么?

我尝试在循环末尾添加 nodelay() 方法:

if screen.getch() == ord('q'):
    break

但是,在循环的一次迭代中调用所有函数需要 2-3 秒。由于应用程序的原因,运行循环频率超过每 5 秒是没有意义的。这意味着,为了使退出程序的方式起作用,我有时必须按住“q”2-8 秒。

我的代码如下所示:

import curses
import time

def main(screen):
    refresh_rate = 5
    screen.nodelay(1)

    # Infinite loop. Displays information and updates it 
    # every (refresh_rate) # of seconds

    while True:

        # Makes several http requests 
        # and passes responses through multiple functions

        # Escape infinite loop
        if screen.getch() == ord('q'):
            break

        # Wait before going through the loop again
        time.sleep(refresh_rate)

if __name__ == "__main__":
    curses.wrapper(main)

我的另一个解决方案是将 while True 替换为:

loop = 1
while loop:

    #Loop code

if screen.getch() == ord('q'):
    loop = -1

这样,就不需要按住“q”来退出程序了。但按一次“q”后仍可能需要长达 8 秒的时间才能退出。

出于显而易见的原因,这似乎不是退出程序的最佳方式。我很确定应该有更好(更快)的解决方案。

除此之外,该程序运行良好。这是 2 个文件,超过 300 行,因此我仅发布代码的相关部分以及我尝试的解决方案。

最佳答案

鉴于您已经有了节点布局,通常的方法是使用时间较短(20-50 毫秒)的 napm,并实现您的 5 秒目标,在多次(10-25)次重复之后运行函数getch/napms 循环。

混合诅咒和标准 I/O 并不能很好地工作,除非您在两者之间切换时小心刷新内容。

关于Python 诅咒 : Exiting a program fast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39886252/

相关文章:

python - 如何使用 python 和 GPIB 接口(interface)访问安捷伦设备(借助 NI GPIB 到 USB 转换器)?

c++ - 如何使用 ncurses 库让 Player 与 Monster 交互?

c - ncurses: Subwin 或 pad 的 subpad

c - 在有或没有 ncurses 的情况下,如何修改 linux 控制台中的键盘重复延迟

python - VIM 如何区分 `Ctrl-J` 和 `LF` 之间的区别?

Python 诅咒、线程 : Output thread reports a lagging value for global variable

python - 导入错误 : No module named PySide

python - 在python csv中处理带有行标题的数据

python-3.x - 如何填充到python-curses中的右下角

Python:以跨平台方式获取AppData文件夹