program story

Ctrl-C로 Python 스크립트를 죽일 수 없습니다

inputbox 2020. 8. 4. 07:21
반응형

Ctrl-C로 Python 스크립트를 죽일 수 없습니다


다음 스크립트를 사용하여 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)

프로세스를 종료하려면 Ctrl+ 를 사용하여 백그라운드로 프로그램을 보낸 후 PID로 프로세스를 종료합니다 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)

이제 Ctrl+ 를 누를 때까지 '첫 번째'와 '두 번째'인 인쇄를 유지 C합니다.

편집 : 주석 작성자가 지적했듯이 데몬 스레드는 임시 파일과 같은 것을 정리할 기회를 얻지 못할 수 있습니다. 필요한 경우 KeyboardInterrupt메인 스레드 를 잡고 정리 및 종료를 조정하십시오. 그러나 많은 경우에 데몬 스레드가 갑자기 죽는 것이 충분할 것입니다.


키보드 인터럽트 및 신호는 프로세스 (예 : 메인 스레드)에서만 볼 수 있습니다 ... 파이썬에서 스레드를 죽이는 Ctrl-c, 즉 KeyboardInterrupt를 살펴보십시오.


I think it's best to call join() on your threads when you expect them to die. I've taken some liberty with your code to make the loops end (you can add whatever cleanup needs are required to there as well). The variable die is checked for truth on each pass and when it's True then the program exits.

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()

참고URL : https://stackoverflow.com/questions/11815947/cannot-kill-python-script-with-ctrl-c

반응형