본문 바로가기
CS/Python

Global Interpreter Lock (GIL) - 파이썬의 길(?) 이란?

by Warehaus 2022. 5. 2.

 

GIL 에 대해서는 Python 코딩의 기술 이라는 책에서

처음 접했던 것 같다.

 

 

 

상호배제잠금 이라는 단어로 설명을 했었는데,

최근 회사에서 대화를 하다가 기억이 제대로 안나서

 

정리 차원에서 포스팅을 해보려고 한다.

 

 

GIL (Global Interpreter Lock)

 

해석을 하면... 전역... 통역가.. 락?

 

책에서 설명하는 GIL의 역할은

 

CPython이 선점형 멀티스레딩의 영향을 받지 않게 막아준다

 

이다.

 

선점형 멀티스레딩의 경우 한 스레드가 다른 스레드를 인터럽트해서 프로그램을 제어하게 되는데,

이 인터럽트가 예상과 다르게 일어나면 인터프리터 상태가 망가진다.

 

이러한 인터럽트를 Lock을 통해서 막아주는 것이 GIL이 되겠다.

 

그런데 이게 문제가 되기도 하는데

그것은 바로 스레드의 병렬성 저하 이다.

 

GIL은 한번에 한 스레드만 실행하게 만들며,

GIL 을 사용하는 Python을 이용한 병렬연산은 성능향상에 크게 도움이 되지 않음을 의미한다.

 

 

그럼 Python thread 왜 사용하는가?  라는 질문을 할 수 있다.

 

GIL에 의해서 병렬연산이 제한됨에도 Python에서 multi-thread를 사용하는 이유는

 

1. 여러 작업을 동시에 하는것 처럼 보이기 위해

2. 시스템 호출 수행 시 발생하는 Blocking I/O를 다루기 위해

 

이다.

 

Python thread를 사용함에 있어 1 에 해당하는 장점도 있겠지만

나는 보통 2 에 해당하는 장점을 효과적으로 사용할 수 있을 때에만 Python thread 를 적극적으로 사용하는 것 같다.

 

GIL 은 파이썬 코드의 병렬 실행을 막을 뿐이지 다른 시스템 호출까지 기다리지는 않는다.

 

다른 시스템 호출에 대한 응답을 기다리는 동안, 다른 Python thread를 수행할 수 있다는 점에서 어느정도의 병렬성을 확보할 수 있기 때문에, Python thread도 목적에 따라서 효과적일 수 있게 될 것이다.