2What — 동시성(Concurrency)이란?
3- 동시성: 여러 작업이 논리적으로 겹치는 시간대에 진행되는 것
4- 병렬성(Parallelism): 물리적으로 같은 순간에 여러 작업이 실행되는 것
5- 동시성 ⊃ 병렬성 — 동시성은 구조(structure), 병렬성은 실행(execution) (Pike, 2012)
6Why — 왜 동시성이 필수인가?
7- 현대 웹 서버: 초당 수천 요청 처리 — 순차 처리 시 1요청 100ms × 10,000 = 1,000초 대기
8- 데이터 파이프라인: 수백 개 파일을 순차로 읽으면 I/O 대기 시간이 누적
9- CPU 코어 수 증가: 2005년 이후 클럭 속도 정체, 멀티코어로 전환 (Sutter, 2005)
10- 단일 스레드 순차 실행은 하드웨어 자원의 대부분을 유휴 상태로 낭비
11핵심 구분 — I/O 바운드 vs CPU 바운드
12- I/O 바운드: 프로그램이 외부 자원(네트워크, 파일, DB) 응답을 기다리며 대부분의 시간을 소비
13 • 예: HTTP API 호출, 파일 읽기/쓰기, 데이터베이스 쿼리
14 • CPU는 놀고 있음 → 대기 시간에 다른 작업을 끼워넣으면 처리량 급증
15 • 적합 전략: 비동기 I/O(asyncio), 멀티스레딩(threading)
16- CPU 바운드: 프로그램이 연산(계산, 변환, 암호화)에 CPU 시간을 집중 소비
17 • 예: 이미지 처리, 수학 시뮬레이션, ML 모델 학습
18 • I/O 대기가 거의 없음 → 스레드를 늘려도 GIL 때문에 이득 없음
19 • 적합 전략: 멀티프로세싱(multiprocessing), C 확장, GPU 오프로딩
20How — 순차 vs 동시 실행 성능 비교 (수치 예시)
21- 시나리오: 10개 웹 API 호출, 각 200ms 소요
22 • 순차 실행: 10 \times 200\text{ms} = 2000\text{ms}
23 • 동시 실행(asyncio): \approx 200\text{ms} (겹쳐서 대기) → 10배 속도 향상
24- 시나리오: 8개 이미지 리사이즈, 각 500ms CPU 연산
25 • 순차 실행: 8 \times 500\text{ms} = 4000\text{ms}
26 • 멀티프로세싱(4코어): \approx 1000\text{ms} → 4배 속도 향상 (코어 수에 비례)
27전략 선택 요약
28- I/O 바운드 → asyncio 또는 threading (GIL 영향 없음, 대기 시간 중첩)
29- CPU 바운드 → multiprocessing (GIL 우회, 별도 프로세스에서 병렬 연산)
30- 혼합 → asyncio + ProcessPoolExecutor 조합 (Hettinger, 2019)
31비유: 식당 주방
32- I/O 바운드 = 주문 접수 후 오븐에서 요리가 나올 때까지 대기 → 대기 중 다른 주문 처리 가능
33- CPU 바운드 = 요리사가 직접 칼질하는 시간 → 요리사(코어)를 더 투입해야 빨라짐
34- 한 명의 요리사가 오븐 앞에서 멍하니 서 있는 것 = 순차 실행의 비효율