2

curses モジュールを使用する無限ループで Python プログラムをすばやく終了する最良の方法は何ですか?

ループの最後にこれと結合した nodelay() メソッドを追加しようとしました:

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

ただし、ループの 1 回の反復ですべての関数呼び出しを行うには 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」を 1 回押した後、終了するまでに最大 8 秒かかる場合があります。

明らかな理由から、これはプログラムを終了する最良の方法ではないようです。私は、より良い(より速い)解決策があるはずだと確信しています。

それ以外は、プログラムは正常に動作します。これは 2 つのファイルで 300 行以上あるため、コードの関連部分だけを試した解決策とともに投稿しています。

4

2 に答える 2