1. ホーム
  2. python

[解決済み] Ctrl-CでPythonスクリプトを終了できない

2022-07-09 05:32:18

質問

以下のスクリプトでPythonのスレッドをテストしています。

import threading

class FirstThread (threading.Thread):
    def run (self):
        while True:
            print 'first'

class SecondThread (threading.Thread):
    def run (self):
        while True:
            print 'second'

FirstThread().start()
SecondThread().start()

Kubuntu 11.10上のPython 2.7で動作しています。 Ctrl + C を実行しても死滅しません。また、システム シグナル用のハンドラを追加してみましたが、これも役に立ちませんでした。

import signal 
import sys
def signal_handler(signal, frame):
    sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

プロセスを終了させるために、プログラムをバックグラウンドに送った後、PIDで終了させています。 Ctrl + Z というように、無視されることはありません。なぜ Ctrl + C が執拗に無視されるのはなぜですか?どうすれば解決できますか?

どのように解決するのですか?

Ctrlキー + C はメインスレッドを終了させますが、スレッドはデーモンモードではないので、実行し続け、プロセスを存続させます。デーモンにすればいいのです。

f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()

メインスレッドがスレッドを起動したら、あとは何もすることがありません。つまり、メインスレッドは終了し、スレッドは即座に破壊されるのです。そこで、メインスレッドを存続させることにしましょう。

import time
while True:
    time.sleep(1)

を打つまで、'first' と 'second' を表示し続けます。 Ctrl + C .

編集してください。 コメントで指摘されているように、デーモンスレッドは一時ファイルのようなものをクリーンアップする機会を得られないかもしれません。もしそれが必要なら KeyboardInterrupt をメインスレッド上でキャッチし、 クリーンアップとシャットダウンを協調させることができます。しかし、多くの場合、デーモン スレッドを突然終了させることは、おそらく十分に良いことです。