파이썬

파이썬, GIL

그레고리력 2021. 7. 13. 21:10

파이썬 GIL(Global Interpreter Lock)


  • 인터프리터에 락을 걸어 다중코어 환경에서 멀티스레드가 실행되지 못하도록 하는 것
  • 압축, 정렬, 인코딩 등 수행시간에 CPU 의 영향이 큰 작업(cpu bound)을 멀티 스레드로 수행하도록 한 경우 성능 문제
  • Python 코드(bytecode)를 실행할 때에 여러 thread를 사용할 경우, 단 하나의 thread만이 Python object에 접근할 수 있도록 제한하는 mutex(MUTual EXclusion, 상호배제)

GIL 문제

  • 멀티 스레드로 만들었어도 본질적으로 싱글 스레드로 동작
  • 멀티스레드일 경우 thread context switch에 따른 비용도 발생하기 때문에 오히려 싱글스레드보다 시간이 오래 걸리는 문제
  • 파이썬의 멀티스레드는 CPU 연산을 위한 것이 아님

왜 GIL을 사용할까?

  • 일반적인 경우 CPU bound 작업보다는 I/O 작업이 많아 하나의 프로그램에서 멀티코어로 작업할 필요는 없음, 멀티프로세싱 모듈로 멀티코어를 구현할 수도 있음
  • python은 기본적으로 garbage collection과 reference counting을 통해 할당된 메모리를 관리
  • 파이썬의 모든 객체는 refernce count, 즉 해당 변수가 참조된 수를 저장
  • 멀티스레드라면 객체의 refernce count 관리를 위해서 모든 객체에 대한 lock이 필요함
  • 이러한 비효율을 막기 위해서 python에서 GIL을 사용(하나의 Lock을 통해서 모든 객체들에 대한 refernce count의 동기화 문제를 해결)

GIL 장점

  • GIL 을 활용한 멀티 스레드가 다른 멀티 스레드보다 구현이 쉬움
  • 레퍼런스 카운팅을 사용하는 메모리 관리 방식에서 GIL 덕분에 오버헤드가 적음