Python GIL 해제 연산의 병렬 처리 구조 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. GIL의 기본 특성

  • Python(CPython)은 GIL(Global Interpreter Lock) 때문에 한 번에 하나의 스레드만 실행 가능
  • 순수 Python 코드(for, list, str 등)는 GIL 때문에 병렬 실행 안 됨

2. C/C++ 확장 연산(GIL 해제 연산)의 병렬 처리 원리

  • NumPy, PIL, PyTorch, OpenCV, scikit-learn 등은 내부가 C/C++로 작성됨
  • 이 연산들은 실행 시 GIL을 일시 해제하고,
  • 그 연산을 자체 스레드 (C 레벨 스레드) 로 처리

3. Python에서 여러 스레드로 GIL 해제 연산을 실행하면?

  • 각 Python 스레드는 연산을 시작하고 GIL을 놓은 뒤 대기 상태로 전환

  • 그 사이 다른 Python 스레드가 GIL을 획득해 실행되거나,

    각 연산은 자체적으로 C 스레드를 생성해 병렬 처리됨


4. 결과적으로 시스템에서 실행 중인 스레드 구성은?

구성 설명
Python 워커 스레드 (N개) 각 연산을 독립적으로 실행
C 내부 연산 스레드 (M개 per 작업) 각 연산이 생성하는 내부 병렬 스레드
총 실행 스레드 수 N (Python) + N × M (C 내부)
  • 예: ThreadPoolExecutor로 4개의 PIL.Image.resize()를 병렬 실행하면,

    → Python 스레드 4개 + C 내부 스레드들(예: libjpeg 스레드들)


5. 핵심 요약

  • GIL 해제 연산은 Python 스레드가 대기하는 동안 C 스레드들이 진짜 병렬 연산을 수행하고, 그 사이 Python은 다른 스레드에게 GIL을 넘기며 계속 병렬 실행된다.