CPython GIL
스레드가 빨라지는지는 작업이 기다리는지로 갈린다
계산이 계속되는 동안에는 GIL 경합이 생기고, I/O 대기 중에는 다른 스레드가 실행 기회를 얻는다.
대상
CPython 인터프리터
잠금
한 번에 하나의 스레드가 bytecode 실행
예외
I/O 대기와 native 확장 호출
CPU 바운드
계산이 멈추지 않아 GIL을 계속 두고 경쟁
1
Thread A 실행
Python bytecode가 GIL을 점유한다.
2
Thread B 대기
같은 인터프리터 안에서 차례를 기다린다.
3
전환 비용
동시에 계산하지 못하고 경합만 늘어난다.
4
해법
멀티코어 계산은 프로세스 병렬화를 쓴다.
I/O 바운드
대기 중 GIL이 풀려 다른 작업이 전진
1
대기 호출
sleep이나 socket 대기에서 실행권을 넘긴다.
2
다른 스레드 실행
A가 기다리는 동안 B가 요청을 처리한다.
3
완료 이벤트
OS가 I/O 완료를 알려주면 결과를 수집한다.
4
해법
네트워크와 파일 대기는 스레드가 효과적일 수 있다.
CPU 계산 multiprocessing이나 native 확장처럼 GIL 바깥 병렬 실행을 선택한다.
I/O 대기 threading, ThreadPoolExecutor, async 방식이 대기 시간을 겹친다.
종료 관리 join()으로 합류하고, 데몬 스레드는 정리 없이 끝날 수 있음을 기억한다.
숫자 자체보다 패턴
예제 시간은 환경마다 달라져도 CPU와 I/O의 방향성은 유지된다.
스레드는 만능 병렬화가 아님
CPython 계산 병렬성은 프로세스나 C 확장 경계를 봐야 한다.
기준은 대기 여부
작업이 CPU를 계속 쓰는지, 외부 I/O를 기다리는지 먼저 분류한다.