본문 바로가기
Python

GIL(Global Interpreter Lock)

by Deeppago 2022. 2. 16.

1. GIL 과 그로인한 성능 문제

GIL 때문에 성능 문제가 대두되는 경우는 압축, 정렬, 인코딩 등 수행시간에 CPU 의 영향이 큰 작업(CPU bound)을 멀티 스레드로 수행하도록 한 경우다. 이 땐 GIL 때문에 멀티 스레드로 작업을 수행해도 싱글 스레드일 때와 별반 차이가 나지 않는다. 이를 해결하기 위해선 멀티 스레드는 파일, 네트워크 IO 같은 IO bound 프로그램에 사용하고 멀티 프로세스를 활용해야한다.

 


2. GIL(Global Interpreter Lock)

GIL 은 스레드에서 사용되는 Lock 을 인터프리터 레벨로 확장한 개념인데 여러 스레드가 동시에 실행되는걸 방지한다. 더 정확히 말하자면 어느 시점이든 하나의 Bytecode 만이 실행되도록 강제한다. 각 스레드는 다른 스레드에 의해 GIL 이 해제되길 기다린 후에야 실행될 수 있다. 즉 멀티 스레드로 만들었어도 본질적으로 싱글 스레드로 동작한다.

GIL 때문에 파이썬 쓰레드는 한 쓰레드에서 CPU점유를 마칠때까지 기다렸다가 다음 쓰레드가 동작한다. 그러므로 I/O가 많고 CPU Idle이 많은 경우에 좋은 성능을 발휘하고, 각 쓰레드 당 작업이 CPU작업이 많을 경우 성능이 느려진다. 

파이썬은 자원배분을 단순하게 한다. 자원 배분을 한 쓰레드에게 할당하고, 끝날때까지 다른 쓰레드가 접근하게 못하는 것이다.

 

 

GIL의 동작을 살펴보면 쓰레드 1번이 자원을 사용중일때, GIL을 쓰레드 1번이 잡고 있어서 다른 쓰레드는 자원을 점유하지 못한다.

쓰레드 1번이 파일 I/O (open), 네트워크 I/O 등의 I/O를 발생시키면 쓰레드 1번은 자신의 GIL을 풀어버리고 자원점유를 멈추게 되고, 대기중인 쓰레드 2번이 GIL을 잡고 , 자원을 점유하게 된다.

 

파이썬이 이런 동작 방식을 갖고도 각광 받는 것은

  1. 분산처리가 발전하면서 한 컴퓨터내의 자원에 묶일 필요가 없고,
  2. 하드웨어의 발전으로 네트워크 I/O가 프로그램 지연의 대부분을 차지하기 때문이다.

또한 GIL을 모른 상태에서 작성을 해도 “잘” 동작하기 때문에 언어의 진입장벽이 상대적으로 낮다. 빅데이터 관련 내용이 발전하면서, 수학자 / 통계학자 / 분석가 분들이 파이썬을 이용해서 쉽게 작업을 하기 때문에 빅데이터 관련 기술로 자리매김하게 된 것이다

 


참고 자료

https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Python#gil

https://medium.com/@mjhans83/python-gil-f940eac0bef9

 

'Python' 카테고리의 다른 글

property (함수/데코레이터)[파이썬/python]  (0) 2022.02.17
메모리 누수[파이썬/python]  (0) 2022.02.17
GC(Garbage Collection)  (0) 2022.02.16
Generator[파이썬/Python]  (0) 2022.02.15
Pass와 Continue[파이썬(python)]  (0) 2022.01.21

댓글