등록 된 atexit 핸들러가 스폰 된 아동 프로세스에 의해 상속됩니까?

StackOverflow https://stackoverflow.com/questions/1052716

  •  20-08-2019
  •  | 
  •  

문제

Python 2.5를 사용하여 데몬 프로그램을 작성하고 있습니다. 기본 프로세스에서 종료 처리기가 등록됩니다. atexit 모듈 보인다 각 어린이 과정이 끝나면 핸들러가 호출되도록합니다.

이 행동이 파이썬에서 언급되지 않았다는 것을 알았습니다 atexit Doc, 누구든지 문제를 아는 사람이 있습니까? 이것이 어떻게 행동 해야하는지, 어린이 프로세스에서 종료 처리기를 어떻게 해제 할 수 있습니까? 버전 3.0에는 atexit.ugregister가 있지만 2.5를 사용하고 있습니다.

도움이 되었습니까?

해결책

Python 2.5에는 API가 없지만 다음과 같이 할 수 있습니다.

import atexit
atexit._exithandlers = []

자식 프로세스에서 - 종료 핸들러가 하나만 설치되고 다른 핸들러가 설치되지 않았다는 것을 알고 있다면. 그러나 stdlib의 일부 (예 : logging) 등록하다 atexit 핸들러. 그들에게 짓밟히는 것을 피하려면 다음을 시도 할 수 있습니다.

my_handler_entries = [e for e in atexit._exithandlers if e[0] == my_handler_func]
for e in my_handler_entries:
    atexit._exithandlers.remove(e)

어디 my_handler_func 입니다 atexit 등록한 핸들러는 다른 사람을 제거하지 않고 항목을 제거해야합니다.

다른 팁

때를 fork 아동 과정을 만들기 위해 해당 아동은 물론 등록 된 출구 기능과 다른 모든 코드 및 데이터 구조를 포함하여 부모의 정확한 사본입니다. 나는 그것이 당신이 관찰하는 문제라고 생각합니다. 물론 모든 모듈에 반드시 적용되기 때문에 각 모듈에 언급되지는 않습니다.

atexit.register() 기본적으로 기능을 등록합니다 atexit._exithandlers, 이는 모듈 개인 기능 목록입니다. sys.exitfunc(). 당신은 설정할 수 있습니다 exitfunc() 맞춤형 출구 핸들러 기능에 따라 자식 상태를 확인하거나 단순히 등록하지 않습니다. 3.0을 복사하는 것은 어떻습니까? atexit.py 로컬 소스 트리에 대신 사용합니까?

편집 : 2.6 버전에서 atexit.py를 복사하여 확장했습니다.

def unregister(func, *targs, **kargs):
    _exithandlers.remove((func, targs, kargs))

원래 버전 대신에 가져 가면 작동해야합니다. 그래도 하위 프로세스로 테스트하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top