GNU/Linux >> Linux の 問題 >  >> Linux

Ctrl-C で Python スクリプトを強制終了できません

join() と呼ぶのが一番いいと思います スレッドが死ぬと予想されるときにスレッドで。私はあなたのループを終了するように自由に変更しました(そこに必要なクリーンアップの必要性を追加することもできます)。変数 die 各パスでチェックされ、True のときにチェックされます 、プログラムは終了します。

import threading
import time

class MyThread (threading.Thread):
    die = False
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name

    def run (self):
        while not self.die:
            time.sleep(1)
            print (self.name)

    def join(self):
        self.die = True
        super().join()

if __name__ == '__main__':
    f = MyThread('first')
    f.start()
    s = MyThread('second')
    s.start()
    try:
        while True:
            time.sleep(2)
    except KeyboardInterrupt:
        f.join()
        s.join()

KeyboardInterrupt とシグナルは、プロセス (つまり、メイン スレッド) によってのみ見られます... 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)

Ctrl を押すまで、'first' と 'second' を印刷し続けます。 +C .

編集: コメンターが指摘したように、デーモン スレッドは一時ファイルなどをクリーンアップする機会を得られない可能性があります。それが必要な場合は、KeyboardInterrupt をキャッチしてください メインスレッドで、クリーンアップとシャットダウンを調整します。しかし、多くの場合、デーモン スレッドを突然終了させるだけで十分です。


@Thomas K の回答の改良版:

  • アシスタント機能の定義 is_any_thread_alive() この要点によると、 main() を終了できます

コード例:

import threading

def job1():
    ...

def job2():
    ...

def is_any_thread_alive(threads):
    return True in [t.is_alive() for t in threads]

if __name__ == "__main__":
    ...
    t1 = threading.Thread(target=job1,daemon=True)
    t2 = threading.Thread(target=job2,daemon=True)
    t1.start()
    t2.start()

    while is_any_thread_alive([t1,t2]):
        time.sleep(0)

Linux
  1. Minicondaを使用してPythonアプリケーションをDocker化する方法

  2. Pythonスクリプトを使用してシェルの作業ディレクトリを変更する

  3. crontab 経由で Python スクリプトを実行する

  1. top によって報告された Python スレッドの ID

  2. 引数を指定して bash から Python スクリプトを呼び出す

  3. &を使用してバックグラウンドで実行すると、Python スクリプトの Nohup が機能しない

  1. Pythonスクリプトを使用したScientificLinux7.1のベクトル代数:パート1

  2. Python.hをコンパイルできません–Websockifyのインストールエラー

  3. 「でスクリプトを実行します。 」と「ソース」で?