GIL은 Global Interpreter Lock의 약자이다. GIL은 Python의 독특한 특징 중 하나이며 Python의 성능을 좌우하는 요소중 하나이다. GIL이 무엇이며 어떤 역할을 하고 어떤 문제를 발생시키는지 간단하게 알아보자.
GIL
GIL이 무엇이며 그 역할이 무엇인지에 대한 파이썬 위키의 설명은 아래와 같다.
In CPython, the global interpreter lock, or GIL, is a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once. The GIL prevents race conditions and ensures thread safety.
위 말을 한글로 풀어 정리하자면,
CPython에서 GIL은 여러개의 쓰레드가 동시에 실행되는 것을 막아서 파이썬 객체에 대한 접근을 보호하는 mutex이다.
GIL은 race conditions를 방지하고 thread safe하도록 한다.
라는 의미이다.
이것을 응용프로그래머 입장에서 직관적으로 이해해보자면,
mutex처럼, Python Interpreter는 하나의 Thread를 실행할 때 다른 Thread의 접근을 막는다(Lock)고 할 수 있다.
그래서 Global하게 작동하는 Interpreter의 Lock => GIL 인 것이다.
마치 동시성(Concurrency) vs 병렬성(Parallelism) 처리 포스트에서 1개 코어가 동시적으로(Concurrent) 2가지 일을 해야하는 상황과 유사하다.
Python 프로그램을 실행시키면 코어가 여러개가 달린 컴퓨터임에도 불구하고 1개의 코어만 100% 사용되는 것을 볼 수 있다. CPU 연산이 많은 작업을 Multi Thread로 실행시켜도 1개 코어만 100%로 열심히 일하고 다른 코어는 여전히 유휴상태로 있게된다.
그래도 이렇게 함으로써 하나의 파이썬 객체에 2개 이상의 쓰레드가 동시에 접근해서 충돌하는 문제를 해결할 수 있다.
threading
Python에도 Multi-Thread 기능이 있다. 하지만 GIL 때문에 Python의 Thread는 병렬적(Parallel)이지 않다. 대신에 동시적(Concurrent)이며 아래 그림과 같이 작동한다고 할 수 있다.
또한 완전히 병렬적으로 돌아가는 개념은 파이썬에서는 Multi-Processing 개념으로 봐야한다.
Python의 종류와 GIL
Python을 구현하는데 몇가지 종류가 있다. 일반적으로 우리가 말하는 Python은 C로 구현한 Python인 CPython이다.
그외에도 Java로 구현한 Python인 Jython이나, IronPython, PyPy 등 다양한 구현체가 있다.
그리고 GIL은 Jpython, IronPython에는 존재하지 않는다.
Leave a comment