1

Ctrl-Cを押すと、次のコードはすぐに終了します。

keep_goingただし、ループの先頭に到達するまでのステータスをチェックしていないため、ループは10秒の遅延後に終了する必要があるようです。このコードがすぐにループを終了するのはなぜですか?

ループが終了する前にループの実行が終了することを確認するにはどうすればよいですか?

import signal
import time

keep_going = True

def signal_handler(signal, frame):
    global keep_going
    print 'quitting!'
    keep_going = False

signal.signal(signal.SIGINT, signal_handler) 

while keep_going:
    print 'looping...'
    time.sleep(10)
    print 'bye!'
4

2 に答える 2

3

Python ドキュメントから:

実際の一時停止時間は、要求された時間よりも短い場合があります。これは、キャッチされたシグナルは、そのシグナルのキャッチ ルーチンの実行後に sleep() を終了するためです。

"bye"つまり、ループは実行を終了します (シグナル ハンドラの の後に出力されることからわかるように"quitting!") sleep

よりも実質的なものを持っていればsleep、本来望んでいたものが見えると思います。

于 2012-12-03T01:35:37.693 に答える
2

信号はスリープ呼び出しを中断し、ループを続行します。条件は False であるため、ループを終了します。Python はスリープ コールを再開しません。

ところで、Python インタープリターは通常、SIGINT 自体をキャッチし、シグナル モジュールを使用する代わりにキャッチできるKeyboardInterrupt例外に変換します。

于 2012-12-03T01:35:05.357 に答える