등록 된 atexit 핸들러가 스폰 된 아동 프로세스에 의해 상속됩니까?
-
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))
원래 버전 대신에 가져 가면 작동해야합니다. 그래도 하위 프로세스로 테스트하지 않았습니다.