Python에는 멀티스레딩이라는 개념은 존재하지만 실제로는 사용되지 않는다. 그 이유는 GIL이라는 기능 때문이다. 파이썬 코드는 인터프리터에 의해 바이트 코드로 변환되는데 이 바이트 코드는 스레드에 의해 실행이 되고 실행되기 직전에 GIL을 걸게 된다. 이렇게 되면 다른 스레드들은 바이트 코드를 실행할 수 없기 때문에 사실상 실업자 신세가 된다...
심지어 thread context switching으로 인해 오버헤드가 지속적으로 발생하기 때문에 오히려 싱글 스레드보다 시간적으로 손해를 보는 구조가 만들어진다.
그렇다면 왜 Python은 GIL을 사용해야만 했을까?
Python의 모든 객체는 reference count라는 변수를 지니게 되는데, 이 변수를 다른 여러 스레드에서 사용하게 되면 동기화 문제가 발생하게 되고 자칫 잘못하면 무결성을 해치게 된다. 따라서 GIL을 이용해 이러한 자원 문제를 해결한 것으로 보인다.
GIL을 도입하면 인터프리터의 구현이 쉬워지고 Garbage Collector 만들기도 좋으며 C/C++ 확장 개발에 용이하기 때문에 파이썬을 많이 사용하고 있다. 또한 프로그램이 I/O를 많이 쓰면 대부분 I/O bound 이기 때문에 파이썬의 쓰레드를 사용하는 것이 좋은 경우도 있다.
이러한 문제를 python에서 해결하는 방법은 multi processing을 도입하는 것이다. 하지만 서로 다른 프로세스는 자원을 공유하지 않기 때문에 프로세스 간 통신을 따로 구현해주어야 하며 통신 간에 오버헤드가 발생하는 것은 감수해야만 한다.
referenced: https://koreapy.tistory.com/677, https://ssungkang.tistory.com/entry/python-GIL-Global-interpreter-Lock은-무엇일까