백엔드 개발 · 심화
Python의 GIL(Global Interpreter Lock)이 멀티스레딩 기반 동시성 프로그래밍에 미치는 영향과 이를 극복하기 위한 대표적인 전략들을 설명하고, 각 전략의 장단점을 비교하여 설명해주세요.
힌트 · GIL의 역할, CPU 바운드 vs I/O 바운드 작업, `multiprocessing` 모듈, 비동기 I/O (`asyncio`)의 적용 시나리오와 한계를 고려하여 설명하세요.
GIL컨텍스트 스위칭병목 현상멀티프로세싱비동기 프로그래밍
모범답안
Python의 GIL은 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 제한하여, CPU 바운드 작업에서 멀티스레딩의 병렬성을 저해하는 주요 원인입니다. 컨텍스트 스위칭 오버헤드만 증가시켜 오히려 성능 저하를 야기할 수 있죠.
이러한 GIL의 영향을 극복하기 위한 대표적인 전략으로는 multiprocessing 모듈을 사용하는 멀티프로세싱과 비동기 프로그래밍 (asyncio)이 있습니다.
multiprocessing은 각 프로세스가 독립적인 파이썬 인터프리터를 가지므로 GIL의 제약을 받지 않아 CPU 바운드 작업에 효과적입니다. 하지만 프로세스 간 통신 오버헤드가 크고 메모리 사용량이 많다는 단점이 있습니다.
반면 asyncio는 단일 스레드 내에서 이벤트 루프를 통해 비동기적으로 I/O 작업을 처리합니다. I/O 바운드 작업에서는 스레드 전환 없이 효율적으로 여러 작업을 처리할 수 있지만, CPU 바운드 작업에는 GIL의 영향을 그대로 받습니다.
따라서 작업의 특성에 따라 적절한 전략을 선택하는 것이 중요합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 Python 면접 질문
- Python의 metaclass란 무엇이며, 어떤 상황에서 사용하나요?
- Python의 __slots__의 용도와 사용 시 이점은 무엇인가요?
- Python의 descriptor란 무엇이며, 어떻게 동작하나요?
- Python에서 메타클래스(Metaclass)는 언제, 어떤 목적으로 사용되며, 이를 활용한 실제 설계 패턴의 예시를 들어 설명해주세요. `type()` 함수와의 관계도 함께 설명해주세요.
- Python의 디스크립터(Descriptor) 프로토콜은 무엇이며, `__get__`, `__set__`, `__delete__` 메서드가 어떻게 동작하는지 설명해주세요. 또한, 실제 코드에서 디스크립터를 활용하여 속성 접근을 제어하는 실용적인 예시를 제시해주세요.