programing

Ctrl-C를 사용하여 Python 스크립트를 죽일 수 없음

topblog 2023. 7. 22. 09:09
반응형

Ctrl-C를 사용하여 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()

이것은 쿠분투 11.10의 파이썬 2.7에서 실행되고 있습니다.C +는 그것을 죽이지 않을 것입니다.또한 시스템 신호에 대한 핸들러를 추가하려고 했지만 도움이 되지 않았습니다.

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

프로세스를 종료하기 위해 Z+로 프로그램을 백그라운드로 보낸 후 PID로 종료합니다. 무시되지 않습니다.+가 왜 그렇게 지속적으로 무시되고 C있습니까?어떻게 해결할 수 있습니까?

메인 스레드를 Ctrl종료하지만C 스레드가 데몬 모드가 아니기 때문에 계속 실행되므로 프로세스가 활성화됩니다.우리는 그들을 데몬으로 만들 수 있습니다.

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

그러나 또 다른 문제가 있습니다. 일단 메인 스레드가 스레드를 시작하면 다른 방법이 없습니다.그래서 그것은 빠져나가고, 실은 즉시 파괴됩니다.그럼 메인 스레드를 유지해 보겠습니다.

import time
while True:
    time.sleep(1)

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

편집: 논평가들이 지적했듯이, 데몬 스레드는 임시 파일과 같은 것들을 정리할 기회를 얻지 못할 수도 있습니다.그게 필요하다면, 그것을 잡아라.KeyboardInterrupt메인 스레드에서 정리 및 종료를 조정합니다.하지만 많은 경우, 데몬 스레드가 갑자기 죽는 것으로 충분할 것입니다.

키보드인터럽트 및 신호는 프로세스(즉, 메인 스레드)에서만 볼 수 있습니다.Ctrl-c.e.를 확인합니다. 키보드파이썬에서 스레드를 죽이기 위한 인터럽트

전화하는 것이 가장 좋을 것 같습니다.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()

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

조심해야 할 간단한 '고차' 하나, 정말 안 켜져 있나요?

저는 Pi4에서 Thonny IDE에서 Python 스크립트를 실행하고 있었습니다.켜지면 ++ShiftC가 +C가 아닌 키보드 버퍼로 전달됩니다.

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

반응형