> 백엔드 개발 > 파이썬 튜토리얼 > Python 프로세스가 중단 없이 SIGTERM을 정상적으로 처리할 수 있습니까?

Python 프로세스가 중단 없이 SIGTERM을 정상적으로 처리할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-11-10 19:23:02
원래의
708명이 탐색했습니다.

Can Python Processes Handle SIGTERM Gracefully Without Interruption?

정상 종료를 위한 SIGTERM 처리

실제 애플리케이션의 맥락에서는 프로세스가 종료 신호를 적절하게 처리할 수 있는지 확인하는 것이 중요합니다. 갑작스러운 중단을 방지하기 위해. Python에서 데몬 프로세스를 관리할 때 SIGTERM(TERM) 처리는 일반적인 요구 사항입니다.

다음 데몬 프로세스 예제를 고려하세요.

def mainloop():
    while True:
        # Important operations
        # ...
        # Sleep
로그인 후 복사

문제:

데몬 프로세스가 기본적으로 SIGTERM 신호를 받으면 실행 흐름이 즉시 중단되어 진행 중인 작업을 완료하지 못한 채 프로세스가 종료됩니다.

질문:

현재 실행 흐름을 중단하지 않고 SIGTERM을 정상적으로 처리할 수 있나요? 목표는 별도의 스레드 내에서 종료 플래그를 설정하여 프로세스가 현재 작업을 마친 다음 정상적으로 종료하도록 하는 것입니다.

해결책:

사용 Graceful Killer 클래스:

간단한 GracefulKiller 클래스를 활용하여 SIGTERM을 우아하게 처리할 수 있습니다.

import signal
import time

class GracefulKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)

    def exit_gracefully(self, signum, frame):
        self.kill_now = True

if __name__ == '__main__':
    killer = GracefulKiller()
    while not killer.kill_now:
        time.sleep(1)
        print("Performing operation...")

    print("Process exited gracefully.")
로그인 후 복사

이 솔루션에서는:

  1. GracefulKiller 클래스는 SIGINT(Ctrl C) 및 SIGTERM(기본적으로 start-stop-daemon에 의해 전송됨)에 대한 신호 처리기를 설정합니다.
  2. 두 신호 중 하나가 수신되면exit_graceously 메서드가 실행됩니다. kill_now 플래그를 True로 설정합니다.
  3. 메인 루프는 kill_now 플래그를 지속적으로 확인합니다. True이면 신호가 수신되었음을 의미하며 프로세스가 정상적으로 종료됩니다.
  4. 이 접근 방식을 사용하면 프로세스가 종료되기 전에 메인 루프가 현재 작업을 완료하여 갑작스러운 종료를 방지할 수 있습니다.

위 내용은 Python 프로세스가 중단 없이 SIGTERM을 정상적으로 처리할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿