파이썬, atexit 종료 처리기

atexit 모듈은 정리 함수 등록/해제를 지원한다. 등록 함수는 정상적인(???) 인터프리터 종료 시 자동 실행된다. 
atexit는 등록 역순으로 처리하므로 A, B, C 등록하면, 인터프리터 종료 시 C, B, A 순서로 실행된다.

 

[참고] 다음과 같은 경우에는 호출되지 않음.
1) 파이썬이 처리하지 않는 시그널에 의해 종료 2) 파이썬 치명 내부 에러가 감지 3) os._exit() 호출

atexit.register(func, *args, **kwargs)
----------------------------------------
종료 시 실행할 함수 func를 등록한다. func에 전달되어야 하는 인자는 register()에 인자로 전달되어야 한다. 
같은 함수와 인자를 두 번 이상 등록 할 수 있다.
정상 프로그램 종료 시(sys.exit() 호출 또는 주 모듈 실행 완료), 등록 함수는 후입선출 순서로 호출된다. 
낮은 수준 모듈은 대개 상위 수준 모듈보다 먼저 임포트 되므로 나중에 정리한다는 가정을 따른다.
이 함수는 func을 반환하므로 데코레이터로 사용할 수 있다.

atexit.unregister(func)
-------------------------
종료 처리에 등록된 함수를 제거한다. 

 

atexit 예제:  

모듈이 임포트 될 때 파일에서 카운터를 읽고 프로그램이 종료 시 카운트를 자동 저장

import atexit

def incrcounter(n):
    global _count
    _count = _count + n

def savecounter():
    with open('counterfile', 'w') as outfile:
        outfile.write('%d' % _count)

atexit.register(savecounter)   # 방식

def goodbye(name, adjective):
    print('Goodbye %s, it was %s to meet you.' % (name, adjective))

# 위치 및 키워드 인자가 등록된 함수가 호출될 때 전달되도록 register()에 전달
atexit.register(goodbye, 'Donny', 'nice') # atexit.register(goodbye, adjective='nice', name='Donny')

@atexit.register # 데코레이터로 사용 (단, 인자 없이 호출하는 함수만)
def goodbye2():
    print('이제 파이썬을 종료합니다.')

try:
    with open('counterfile') as infile:
        _count = int(infile.read())
except FileNotFoundError:
    _count = 0

 

 

 

반응형

+ Recent posts