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