← 질문 목록
#74깊이 0
스레드를 늘려도 CPU 병렬성이 없는 이유는?
CPython 기본 빌드에서는 같은 인터프리터에 속한 스레드 하나만 한 시점에 파이썬 바이트코드를 실행한다. CPU 연산 스레드를 늘리면 GIL 경합과 전환 비용만 커질 수 있다.
| 순서 | 스레드 A | 스레드 B | 스레드 C |
|---|---|---|---|
| 1 | 바이트코드 실행 | GIL 대기 | GIL 대기 |
| 2 | GIL 대기 | 바이트코드 실행 | GIL 대기 |
| 3 | GIL 대기 | GIL 대기 | 바이트코드 실행 |
셋을 띄워도 한 칸에 하나만 돈다. 코어가 넉넉해도 마찬가지다. 늘린 만큼 기다리는 줄만 길어진다.
| 기준 | CPU 연산 | I/O 대기 |
|---|---|---|
| 스레드 효과 | GIL 경합 | 대기 중 다른 스레드 실행 |
| 주된 선택 | 멀티프로세스 | 스레드·비동기 |
대기하는 많은 I/O 호출과 일부 네이티브 확장은 GIL을 놓는다. 그래서 네트워크 작업이나 GIL을 해제하는 수치 연산은 스레드로도 겹쳐 실행할 수 있다.
멀티프로세스는 CPU 병렬성을 얻지만 메모리와 직렬화 비용을 낸다. GIL도 복합 연산의 논리적 경쟁까지 막지 않으므로 공유 상태는 따로 동기화해야 한다.
추천 꼬리질문
관련 질문
- 스레드 풀을 사용하는 주된 이유는 무엇인가?운영체제스레드 생성 및 관리 비용과 CPU 자원 활용의 효율성이라는 공통된 개념을 다룹니다.
- 컨텍스트 스위칭 시 CPU는 무엇을 저장하고 복원하는가?운영체제CPU 병렬성 부족의 원인인 컨텍스트 스위칭 오버헤드와 직접적으로 연관된다.
- 프로세스와 스레드의 핵심 차이는 무엇인가?운영체제프로세스와 스레드의 차이를 이해해야 스레드가 CPU 자원을 어떻게 공유하고 경쟁하는지 알 수 있다.
- 안드로이드 메인 스레드에서 무거운 작업을 하면 왜 ANR이 발생하는가?모바일
- 커넥션 풀 크기를 CPU 코어 수로 잡는 이유는?데이터베이스