
1. 기본/개요
파이썬에서 동시에 여러 작업을 처리하는 대표적인 두 가지 방법은 threading 모듈과 multiprocessing 모듈입니다. 이 둘의 차이를 이해하려면 먼저 GIL(Global Interpreter Lock)을 알아야 합니다. GIL은 CPython 인터프리터에서 파이썬 객체에 대한 접근을 보호하는 뮤텍스(mutex)로, 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 강제합니다. 이는 파이썬의 메모리 관리(특히 참조 카운팅 기반 가비지 컬렉션)가 스레드에 안전하지 않기 때문에 도입된 장치라고 설명됩니다.
threading 모듈은 하나의 프로세스 안에서 여러 스레드를 실행하며, 각 스레드는 독립적으로 동작하지만 동일한 메모리 공간을 공유합니다. 반면 multiprocessing 모듈은 완전히 분리된 별도의 작업 공간을 만드는데, 각 프로세스는 자신만의 메모리 공간과 자신만의 파이썬 인터프리터, 그리고 결정적으로 자신만의 GIL을 가집니다. 이 때문에 여러 프로세스는 서로 다른 CPU 코어에서 진짜로 병렬 실행될 수 있습니다.
2. 기능/스펙
threading은 메모리를 공유하기 때문에 오버헤드가 낮고 데이터 교환이 쉽지만, GIL의 제약으로 CPU 바운드 작업에서는 진짜 병렬 실행이 되지 않습니다. multiprocessing은 GIL의 영향을 받지 않아 CPU 바운드 작업에서 실제 병렬 처리가 가능하지만, 프로세스마다 별도의 메모리 공간을 쓰기 때문에 오버헤드가 크고, 프로세스 간 데이터 교환을 위해서는 Queue·Pipe·Manager 같은 IPC(프로세스 간 통신) 도구를 별도로 구성해야 합니다.
최근 가장 중요한 스펙 변화는 GIL 자체의 선택적 제거입니다. Python 공식 문서에 따르면 Python 3.13부터 CPython은 GIL이 비활성화된 "free-threading" 빌드를 지원하기 시작했습니다. 이후 Python 3.14 릴리스 노트와 관련 PEP(PEP 779)에 따르면, free-threaded 빌드는 실험적 단계를 지나 공식적으로 지원되는 단계(Phase II)로 전환되었으며, 별도의 바이너리(3.14t로 표기)로 제공됩니다. 공식 문서는 free-threaded 빌드가 기본 GIL 활성화 빌드에 비해 코드 실행 시 추가적인 오버헤드를 가지며, pyperformance 벤치마크 스위트 기준으로 macOS aarch64에서는 약 1%, x86-64 리눅스 시스템에서는 최대 약 8%의 평균 오버헤드가 발생한다고 명시하고 있습니다.
3. 장단점 (내 생각과 비판 포함)
threading의 장점은 가볍다는 점입니다. 스레드는 생성 비용이 낮고 메모리를 공유하므로 데이터 교환이 간단합니다. 파일 읽기, 네트워크 요청처럼 CPU가 유휴 상태로 대기하는 I/O 바운드 작업에는 효율적입니다. 다만 CPU 바운드 작업에 threading을 적용해봤자 GIL 때문에 속도 향상을 기대하기 어렵다는 점은 명확한 한계이며, 이를 모르고 threading으로 연산 성능을 높이려는 시도는 실무에서 흔한 오해로 보입니다.
multiprocessing은 CPU 바운드 작업에서 진짜 병렬 처리가 가능하다는 확실한 장점이 있습니다. 다만 개인적으로 비판하고 싶은 지점은 IPC의 복잡성입니다. 프로세스 간 데이터를 주고받으려면 직렬화(피클링) 비용이 들고, Queue나 Manager 같은 도구를 다루는 코드가 threading 대비 확연히 번거로워집니다. free-threading(GIL 제거 빌드)에 대해서도 낙관만 하기는 이릅니다. 2026년 7월 현재 시점 기준으로도 GIL을 명시적으로 안전하다고 표시하지 않은 C 확장 모듈을 불러오면 인터프리터가 경고 없이 GIL을 자동으로 다시 활성화시킬 수 있다고 공식 문서에 명시되어 있어, 서드파티 라이브러리 생태계 전체가 free-threading에 완전히 대응하기까지는 시간이 더 필요하다고 판단됩니다.
4. 추천대상
파일 다운로드, 네트워크 요청, 데이터베이스 조회처럼 CPU가 대기하는 시간이 많은 I/O 바운드 작업이라면 threading이나 asyncio가 적합합니다. 반대로 이미지 처리, 대량 수치 계산, 데이터 변환처럼 CPU 연산 자체가 병목인 작업이라면 multiprocessing을 우선 검토해야 합니다. Python 3.13 이상을 사용하고 있고 사용 중인 라이브러리들이 free-threading을 지원한다면, multiprocessing의 IPC 오버헤드 없이 스레드로 진짜 병렬 처리를 구현하는 free-threaded 빌드 도입도 검토할 수 있지만, 프로덕션 도입 전에는 사용 중인 C 확장 라이브러리들의 free-threading 호환 여부를 개별적으로 확인해야 합니다.
5. FAQ
Q1. GIL이란 정확히 무엇인가요?
A. CPython 인터프리터가 파이썬 객체에 대한 접근을 보호하기 위해 사용하는 뮤텍스로, 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 보장합니다.
Q2. multiprocessing은 GIL의 영향을 받나요?
A. 받지 않습니다. 각 프로세스가 자신만의 인터프리터와 자신만의 GIL을 가지므로, 프로세스 간에는 GIL이 병목이 되지 않습니다.
Q3. free-threaded 파이썬은 어떻게 사용하나요?
A. Python 3.13부터 python.org의 Windows·macOS 설치 프로그램에서 free-threaded 바이너리 설치를 선택할 수 있으며, Python 3.14부터는 이 빌드가 3.14t라는 이름의 별도 바이너리로 공식 제공됩니다.
Q4. free-threaded 빌드는 항상 더 빠른가요?
A. 아닙니다. 공식 문서에 따르면 free-threaded 빌드는 기본 빌드 대비 코드 실행에 벤치마크 기준 최대 약 8%의 추가 오버헤드가 있으며, GIL을 명시적으로 지원하지 않는 C 확장 모듈을 사용하면 GIL이 자동으로 다시 켜질 수 있습니다.
6. 출처
Python 공식 문서, Python support for free threading (docs.python.org/3/howto/free-threading-python.html)
Python 공식 문서, What's New in Python 3.14 (docs.python.org/3/whatsnew/3.14.html)
PEP 703 – Making the Global Interpreter Lock Optional in CPython (peps.python.org/pep-0703)
Medium, Moraneus, "Understanding Multithreading and Multiprocessing in Python"
Zero To Mastery, "Beginner's Guide to Multithreading vs Multiprocessing in Python"