Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • PYTHON
  • 프로그래머스
  • TensorFlow
  • 알고리즘
  • 파이썬
  • mysql
  • 코딩테스트
  • 백준
  • sql
  • class
  • 선형대수학
  • 딥러닝
  • 객체지향
  • AI
  • Baekjoon
  • 프로그래밍
  • 머신러닝
  • 데이터베이스
  • 하둡
  • 자료구조
  • 빅데이터
  • 선형대수
  • pytorch
  • MariaDB
  • 인공지능
  • 데이터
  • 코테
  • 파이썬기초
  • 객체
  • 데이터사이언스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

파이썬/파이썬 기초

[python] finally 블록 - 파이썬의 자원정리 방법

2023. 3. 5. 15:47
반응형

파이썬으로 작업하다보면 예외 처리시,  finally 블록을 사용하는 것을 곧잘 목격할 수 있습니다.

 

finally는 언제 사용하는 것일까요?

 

이 finally 블록은 예외 발생 여부와 상관없이 반드시 실행해야 할 명령을 지정합니다.

 

이해를 돕기 위해 예를 들어보겠습니다.

 

어떠한 데이터 분석과제를 위해 모든 gpu자원을 하나의 계정(user A)으로 할당해주었습니다.

 

그렇다면 동일한 서버 내 다른 유저(user B)는 사용중인 gpu에 접근할 수 없을 것입니다.

 

이때 만약에 user A가 딥러닝을 돌려놓고 밥먹으러 나갔다면, 또는 외출했다고 가정해보겠습니다.

 

user B는 gpu를 활용해야 하지만, user A가 사용하고 있어서 활용하지 못하게 됩니다. 

하지만 user A의 딥러닝 코드가 에러가 났다면, 다른 사람들을 위해 자원 할당을 해제해줘야합니다.

별다른 처리를 하지 않았다면, 에러가 나더라도 gpu 자원이 user A에게 할당되어 있을 것입니다.

그렇다면 user B는 해야할 일이 있음에도 user A가 돌아와서 접속을 끊을 때까지 기다릴수밖에 없는 상황에 직면할 수 있습니다.

이럴 때 finally를 사용할 수 있습니다.

 

아래 예제를 보겠습니다.

 

try:
    print('네트워크 접속')
    a = 2 / 0  # zero division error
    print('네트워크 통신 수행')
    
finally:
    print('접속 해제')
    
print('작업 완료')



# ---- 출력물 --------
# 네트워크 접속
# 접속 해제
# ---------------------------------------------------------------------------
# ZeroDivisionError                         Traceback (most recent call last)
# Cell In[21], line 3
#       1 try:
#       2     print('네트워크 접속')
# ----> 3     a = 2 / 0
#       4     print('네트워크 통신 수행')
#       5 finally:

# ZeroDivisionError: division by zero

네트워크 접속한 후, 통신을 수행하고 다 완료하면 접속을 끊는 것이 정상적인 순서입니다.
통신 수행 중에 예외가 발생해서 해제하지 못하면 네트워크는 계속 연결된 상태로 남아 있게 됩니다.
이럴 때 해제 구문을 finally 블록에 작성해 두면 연결이 끊어짐을 보장할 수 있습니다.

try 블록이 정상적으로 실행될 때는 물론이고 예외에 의해 강제로 벗어나더라도 finally 블록을 반드시 실행하도록 되어 있습니다. 

심지어 함수 내부의 try 블록에서 return 문으로 함수를 종료하더라도 finally 블록을 실행한 후 리턴하게 되어 있어 정리 코드는 틀림없이 실행됩니다

 

네트워크 뿐만 아니라 외부의 자원을 사용하는 모든 코드는 해제에 신경 써야 합니다.

특히 파일 입출력 시 파일을 다 사용한 후 반드시 닫아야 하는데 이때도 finally 구문이 유용합니다.

(그러나 파일은 with 구문이 더 편리해 주로 with 구문을 사용합니다)

반응형
저작자표시 (새창열림)

'파이썬 > 파이썬 기초' 카테고리의 다른 글

[python] 반복자(iterator)와 제너레이터(generator)  (0) 2023.04.05
[python] is 연산자란?  (0) 2023.03.05
[python] 키워드 가변 인수 (keyword variable arguments)  (0) 2023.03.05
[python] 함수 - 가변 인수  (0) 2023.03.05
    '파이썬/파이썬 기초' 카테고리의 다른 글
    • [python] 반복자(iterator)와 제너레이터(generator)
    • [python] is 연산자란?
    • [python] 키워드 가변 인수 (keyword variable arguments)
    • [python] 함수 - 가변 인수
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바