CPython의 GIL

SeunghoChoe·2021년 2월 26일
0

새삼 한글 번역이 되어있는 Python 공식 문서를 보면서 감사함을 느낍니다.

쓰레드 기반 병렬 처리시 주의점

Python 문서에서는 CPython의 경우, 전역 인터프리터 락(Global Interpreter Lock)을 걸기 때문에 한 시점에서 하나의 쓰레드만이 파이썬 코드를 실행할 수 있다고 설명합니다. 물론 입출력 작업(I/O)이 이루어질 때는 락을 반납하기 때문에, 입출력 작업이 많은 경우에는 쓰레드 기반의 병렬처리가 유효하다고 합니다.

글로벌 인터프리터 락(Global Interpreter Lock)

공식 문서에선 다음과 같이 설명합니다.

한 번에 오직 하나의 스레드가 파이썬 바이트 코드 를 실행하도록 보장하기 위해 CPython 인터프리터가 사용하는 메커니즘.

병렬 처리는 항상 공유자원에 대한 경쟁 상황을 유발하며, 이에 따르는 부작용 또한 발생합니다. Python이 간결한 코드 작성을 추구한다는 관점에서, Python 개발자가 공유자원을 고려한 프로그래밍을 피할 수 있도록 언어를 설계한 듯합니다.

결론

  1. Python 사용시 쓰레드 기반의 병렬 처리는 한 시점에 하나의 쓰레드만 동작하도록 설계되어 있습니다.
  2. 따라서 계산 집약적인 Task의 경우 쓰레드 기반의 병렬 처리를 사용한다면 성능상의 이점이 없습니다.
  3. 다만 I/O작업시에는 GIL을 반납하므로, 병렬 처리의 이점을 취할 수 있습니다.
profile
I'm a software engineer

0개의 댓글