with
문을 사용해 자동으로 리소스를 해제하는 것이 좋은 방법입니다.메모리 누수란?
프로그램이 더 이상 필요하지 않은 메모리를 해제하지 않아서 발생하는 문제
예시:
def create_leak():
leaky_list = []
while True:
leaky_list.append("Leak") # 이 리스트는 끝없이 커져가며 메모리를 차지하게 됩니다.
leaky_list
가 무한히 커지면서 메모리 누수가 발생합니다. 시스템 리소스란?
시스템 리소스의 예시:
1. 파일 핸들:
file = open('example.txt', 'r')
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection = sqlite3.connect('example.db')
리소스를 올바르게 해제하는 예시:
파일 핸들을 사용하는 경우:
# 파일을 열고 작업한 후 닫기
file = open('example.txt', 'r')
try:
data = file.read()
finally:
file.close() # 파일 핸들을 닫아 메모리 누수를 방지
더 나은 방법:
# with 문을 사용하여 파일을 자동으로 닫기
with open('example.txt', 'r') as file:
data = file.read()
# with 블록을 벗어나면 파일이 자동으로 닫힘
네트워크 소켓을 사용하는 경우:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(('example.com', 80))
# 데이터 송수신 작업
finally:
sock.close() # 소켓을 닫아 리소스를 해제
데이터베이스 커넥션을 사용하는 경우:
import sqlite3
conn = sqlite3.connect('example.db')
try:
cursor = conn.cursor()
cursor.execute('SELECT * FROM example_table')
results = cursor.fetchall()
finally:
conn.close() # 데이터베이스 커넥션을 닫아 리소스를 해제