서버 백엔드나 과학 컴퓨팅 프로그램과 같이 장기간 실행되는 Python 프로그램에는 특별한 주의가 필요합니다. 실행 중인 프로그램을 종료하기 위해 Ctrl+C를 사용하는 것과 같은 특정 작업을 수행할 때 프로그램을 일찍 종료해야 할 수도 있습니다. 일반적으로 이 상황에는 두 가지 가능성이 있습니다. 하나는 프로그램에 오류가 있어서 조정을 위해 프로그램을 중지해야 하는 경우입니다. 다른 하나는 프로그램 자체는 정확하지만 프로그램이 너무 느리게 실행되거나 일찍 종료되기를 원할 수 있다는 것입니다. 이 시나리오에서는 해당 계산 결과를 유지하기를 바라는 경우가 많습니다. 그러나 일부 타사 데이터 저장 형식을 사용하여 데이터를 저장하는 경우 프로그램 실행이 완료된 후 결과를 저장하는 것이 매우 일반적입니다. 프로그램이 도중에 종료되면 결과를 저장하기 위해 특별한 수단이 필요합니다.
먼저 비교적 간단한 사례를 살펴보겠습니다. 숫자를 인쇄하고 1초마다 숫자를 인쇄하는 일반 프로그램에서 Python의 signal.signal을 사용하여 이 종료 신호를 캡처할 수 있습니다.
# signal_exit.py import signal import sys def signal_handler(signal, frame): print ('\nSignal Catched! You have just type Ctrl+C!') sys.exit(0) if __name__ == '__main__': import time signal.signal(signal.SIGINT, signal_handler) for x in range(100): time.sleep(1) print (x)
이 프로그램을 절반쯤 실행하고 Ctrl+C를 동시에 누르면 다음과 같은 결과를 얻게 됩니다:
$ python3 signal_exit.py
0
1
2
^C
Signal Catched! Ctrl+C만 입력하면 됩니다!
이 결과는 프로그램 실행 중 Ctrl+C의 외부 작업을 캡처하고 그에 따라 작업을 처리한 후 프로그램 실행을 종료했음을 보여줍니다. 이때 sys.exit(0)의 종료 연산을 추가하지 않으면 프로그램은 멈추지 않고 계속 실행되는데, 이는 비정상적인 종료 신호를 잡았지만 아무런 처리도 하지 않는 것과 같다.
위의 경우 "실행 종료"라는 외부 신호만 캡처했는데, 더 나아가면 마지막 출력 번호를 캡처하고 싶은데, 어떻게 작동하나요? signal.signal 함수 자체는 많은 매개변수 전달을 지원하지 않습니다. 이때 직접 클래스를 만들고 signal_handler 함수를 클래스의 멤버 함수로 캡슐화하면 해당 내부 매개변수를 얻을 수 있습니다. , 예를 들어 다음과 같은 경우가 표시됩니다.
# signal_exit.py import signal import sys import time class Printer: def __init__(self): self.x = 0 signal.signal(signal.SIGINT, self.signal_handler) def signal_handler(self, signal, frame): print ('\nSignal Catched! You have just type Ctrl+C! The last number is: {}'.format(self.x)) sys.exit(0) def run(self, counter=10): while self.x < counter: print (self.x) time.sleep(1) self.x += 1 if __name__ == '__main__': printer = Printer() printer.run(counter=100)
이때 프로그램이 실행되는 동안 Ctrl+C를 동시에 누르면 결과는 다음과 같습니다.
$ python3 signal_exit.py
0
1
2
3
^C
Signal Catched! Ctrl+C를 입력하면 됩니다. 마지막 숫자는 3
보시다시피 마지막 출력 매개변수를 성공적으로 캡처했습니다.
위 내용은 Python3에서 Ctrl+C 종료 신호를 캡처하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!