Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 딕셔너리는 정말 스레드로부터 안전할까? GIL 완벽 이해하기

네, Python의 딕셔너리(dict)는 기본적으로 스레드로부터 안전(thread-safe)합니다. 실제로 Python의 모든 내장 자료형은 스레드로부터 안전하도록 설계되어 있습니다.

GIL(전역 인터프리터 잠금)이란?

이러한 스레드 안전성은 CPython의 GIL(Global Interpreter Lock, 전역 인터프리터 잠금) 덕분입니다. GIL은 한 번에 하나의 스레드만 Python 바이트코드를 실행할 수 있도록 제어하는 뮤텍스(mutex)입니다. 그 결과, 여러 스레드가 동시에 같은 딕셔너리에 접근하더라도 개별 연산(항목 읽기, 쓰기, 삭제 등)은 원자적으로 처리되어 데이터 손상이 발생하지 않습니다.

주의해야 할 점

다만 '스레드로부터 안전'이라는 표현을 오해해서는 안 됩니다. 개별 연산은 안전하지만, 여러 연산을 조합한 로직은 여전히 경쟁 상태(race condition)에 노출될 수 있습니다.

예를 들어 다음과 같은 코드는 안전하지 않습니다.

if key not in my_dict:
    my_dict[key] = value

'키 존재 여부 확인'과 '값 할당' 사이에 다른 스레드가 개입할 수 있기 때문입니다. 이처럼 확인 후 실행(check-then-act) 패턴을 사용할 때는 명시적인 잠금이 필요합니다.

안전한 멀티스레딩을 위한 방법

  • threading.Lock: 공유 자원에 접근할 때 명시적으로 잠금을 걸어 경쟁 상태를 방지합니다.
  • queue.Queue: 스레드 간 데이터 전달에는 내부적으로 잠금이 구현된 큐를 사용하는 것이 권장됩니다.
  • concurrent.futures: 스레드 풀을 활용해 작업을 관리하면 잠금 관리 부담을 줄일 수 있습니다.

정리

Python 딕셔너리와 내장 자료형은 GIL 덕분에 개별 연산 수준에서 스레드로부터 안전합니다. 하지만 복합적인 연산이나 체크 후 실행 패턴에서는 여전히 잠금 메커니즘이 필요할 수 있습니다. 더 자세한 내용은 공식 문서(GIL 문서)를 참고하세요.