GIL(Global Interpreter Lock)은 하나의 thread만 Python Object에 접근할 수 있도록 제한하는 mutex다.
하나의 쓰레드가 실행될 때 mutex를 얻으면 다른 쓰레드는 mutex를 가져간 쓰레드가 잠금을 풀 때 까지 기다린다.
멀티쓰레드라도 사실상 병렬적으로 실행 되지 않고, 오히려 성능 저하로 이어질 수 있다!
?????
자바스크립트에서 벗어나 멀티쓰레딩을 해보는가!! 했는데 시작하자마자 이게 뭔 소린가 싶어 찾아보았다.
mutex를 거는 이유!?
CPython 메모리 관리가 thread-safe하지 않다는 것에 있다.
CPython은 reference count을 통해 메모리를 관리하게 되는데 (ex. reference count가 0이면 메모리를 회수한다),
Reference counting 중에 race condition이 일어난다면, 메모리 누수나 있어야 할 오브젝트가 사라지는 끔찍한 일이 발생할 수 있다.
이를 방지하기 위한 해결책이 하나의 쓰레드가 인터프린터를 통째로 점유하고 잠궈버리는 것 ^오^
Ruby와 같이 GIL을 사용하는 다른 언어도 존재하지만, 분명 GIL의 사용을 피해간 언어들도 많다.
GIL로 제한적인 멀티쓰레딩이 될 수 밖에 없는데, 왜 GIL을 사용할까?
도입 배경을 보면
- 파이썬이 슬슬슬 떠오르던 당시에는 쓰레드의 개념이 없었다.
- 이미 파이썬을 위한 많은 C extension들이 존재했고, 이 방대한 C extension들을 지키기 위해선 GIL이 제공하는 thread-safe한 메모리 관리가 필요했다.
좋은 점?
- 간단하게 Deadlock의 위험이 사라진다.
- 하나의 Lock만 관리함으로써 싱글쓰레드 환경에서 좋은 퍼포먼스를 보인다.
- I/O Bound Task 같은 경우에는 I/O 요청시에 인터프린터 점유를 풀기 때문에 좋은 성능을 보일 수 있다.
현재는 GIL에 대한 불만이 꽤 있으면서도, 싱글쓰레드 환경에서 가지는 성능적 이점 때문에 사실상 GIL을 놓을 수 없는 상태에 있는걸로 보인다. 아래에, 굉장히 많이 인용되어지는 파이썬 개발자 반 귀도 로섬의 말을 보면 알 수 있다.
But I also don’t expect it to go away until someone other than me goes through the effort of removing it, and showing that its removal doesn’t slow down single-threaded Python code.
+
- 현재 병렬처리는 주로 멀티프로세스를 많이 이용하는데, 오버헤드가 커 스케일링시에 병목이 올 수 있어 주의가 필요하다.
- 여러개의 인터프린터를 만들어 여러개의 락을 만들 수 있는 방법이 도입 될듯하다. - PEP574 이부분에 대해서는 조금 더 공부가 필요할듯!
Resource
https://realpython.com/python-gil/
https://www.artima.com/weblogs/viewpost.jsp?thread=214235
https://hackernoon.com/has-the-python-gil-been-slain-9440d28fa93d