Python GIL

Creator
Creator
Seonglae ChoSeonglae Cho
Created
Created
2020 May 31 13:23
Editor
Edited
Edited
2024 Aug 13 13:55
Refs
Refs
PEP 703

Python Global Interpreter Lock

GIL이 있다고 Thread Safe 하지 않음
GIL 은 스레드에서 사용되는 Lock 을 인터프리터 레벨로 확장한 개념인데 여러 스레드가 동시에 실행되는걸 방지
멀티 스레드로 만들었어도 본질적으로 싱글 스레드로 동작
더 정확히 말하자면 어느 시점이든 하나의 Bytecode 만이 실행되도록 강제
각 스레드는 다른 스레드에 의해 GIL 이 해제되길 기다린 후에야 실행
  • C에서 thread를 사용할 때에 race condition이 일어나지 않도록 하는 것은 순전히 사용자의 몫이다.
  • CPython은 생성되는 개체의 reference를 세어가면서 메모리 관리를 한다.
 
 

느리다

  • 일단 단일 thread일 때는 아무런 문제가 없다.
  • CPU가 바쁘게 계산하는 일들은 numpy/scipy에서 GIL 바깥에서 굉장히 효율적인 C 코드로 연산할 수 있다.
  • 병렬 처리에 관해서는 굳이 thread가 아니더라도 multiprocessing이나 asyncio 등의 많은 선택지가 있다.
  • 굳이 thread 간의 동시적인 처리가 필요하다면 다른 Python implementation을 고려해봐도 된다. Jython, IronPython, Stackless Python, PyPy 등이 있다.
 
 

장점

  • 레퍼런스 카운팅을 사용하는 메모리 관리 방식에서 GIL 덕분에 오버헤드가 적어 싱글 스레드일 때 fine grained lock 방식보다 성능이 우월
  • 구현이 쉼다
  • C extension 을 활용할 때 GIL 은 해제되므로 C library 를 사용하는 CPU bound 프로그램을 멀티 스레드로 실행하는 경우 더 빠를 수 있다
 
 
 

Without GIL

Optional in Python 3.13

Why

Thread Safe

 
 
 

Recommendations