더북(TheBook)

icon_wait


파이썬의 전역 인터프리터 락

파이썬의 전역 인터프리터 락(Global Interpreter Lock, GIL)은 상호 배제를 구현하는 한 가지 방법인 뮤텍스(mutex)로 한 번에 스레드 여러 개가 바이트 코드를 실행하는 것을 막아 줍니다. 멀티코어에서도 싱글코어를 사용하는 것과 같은 효과를 내는데 이는 CPython의 메모리 관리(memory management)가 스레드에 안전하지(thread-safe) 않기 때문입니다. 스레드에 안전하다는 의미는 어떤 자원에 여러 스레드가 동시에 접근해도 실행이 잘 된다는 의미입니다. Jython이나 IronPython은 GIL이 없어서 멀티코어에서 멀티스레딩을 구현할 수 있습니다.

GIL의 작동 방식은 Lock 객체와 유사합니다. 한 스레드가 실행되면 이 스레드는 GIL을 획득(acquire)하고 나머지 스레드는 실행되지 않습니다. 실행 중이던 스레드가 I/O 작업을 시작하면 GIL을 반환(release)하고 다른 스레드가 GIL을 획득합니다. 실행 중인 스레드가 I/O 작업을 하지 않더라도 타임 슬라이스가 지나면 GIL을 반환하고 다른 스레드에게 CPU 할당을 양보합니다. 타임 슬라이스는 이미 본문에서 sys 모듈의 getswitchinterval( ) 메서드로 확인해 보았으므로 따로 설명하지 않습니다.

GIL로 인해 멀티코어의 장점을 활용하지 못한다 해도 GIL이 멀티스레드를 사용하지 않는 이유가 되어서는 안 됩니다. GIL에도 불구하고 멀티스레딩은 여전히 동시 실행(concurrency)에 대한 문제를 해결하는 좋은 방법이기 때문입니다. 심지어 어떤 경우에는 성능 향상까지 기대할 수 있습니다. 현재도 GIL 향상을 위해 많은 파이썬 프로그래머가 노력하고 있습니다. GIL은 점점 더 좋아질 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.