-
[Python] Asyncio Vs Threading Vs Multiprocessing — 무엇을 선택해야 할까IT 2026. 1. 23. 11:41
무엇을 선택해야 할까
파이썬에서 동시성 이야기를 시작하면 반드시 마주치는 질문이 있습니다.
“이건 asyncio로 해야 하나요, threading으로 해야 하나요?” “multiprocessing은 언제 쓰는 거죠?”
이 질문이 어려운 이유는, 세 기술이 겉으로는 비슷해 보이지만 전혀 다른 문제를 해결하기 때문입니다. 이 글에서는 성능 비교보다는, 사고 기준을 중심으로 어떤 상황에서 무엇을 선택해야 하는지 정리해보겠습니다.
먼저 한 문장으로 요약하면
- asyncio는 기다림을 잘 다루기 위한 도구입니다
- threading은 막아두지 않고 같이 일하게 하는 도구입니다
- multiprocessing은 CPU를 더 쓰기 위한 도구입니다
이 문장을 이해하면 선택의 절반은 끝난 셈입니다.
asyncio — 기다림이 많은 문제를 다룰 때
asyncio는 병렬 실행을 하지 않습니다. 대신, 하나의 스레드에서 여러 작업의 흐름을 번갈아 관리합니다.
이 방식이 효과적인 경우는 명확합니다.
- 네트워크 요청이 많을 때
- 외부 API 호출이 잦을 때
- DB, 캐시, 파일 I/O 대기가 길 때
이런 상황에서 프로그램은 대부분 이렇게 시간을 씁니다.
“아직 응답 안 왔네… 기다리는 중”
asyncio는 이 기다림을 숨기고, 그 사이에 다른 일을 처리합니다.
asyncio를 선택해야 하는 신호
- 작업 대부분이 I/O 대기
- 동시에 처리해야 할 요청 수가 많음
- 응답성(latency)이 중요함
반대로, CPU 연산이 많은 코드에서는 asyncio는 거의 도움이 되지 않습니다.
threading — 막히지 않게 나눠서 처리할 때
threading은 여러 스레드를 만들어 작업을 나눕니다. 하지만 파이썬에는 GIL이 있기 때문에, CPU-bound 작업에서는 진짜 병렬 실행이 일어나지 않습니다.
그럼에도 threading이 유용한 이유는 따로 있습니다.
- 하나의 작업이 막혀도
- 다른 작업이 계속 진행될 수 있기 때문입니다
대표적인 예는 다음과 같습니다.
- 동기 라이브러리를 써야 하는 상황
- 레거시 코드와 함께 동작해야 할 때
- 간단한 병렬 I/O 작업
threading을 선택해야 하는 신호
- 코드 구조를 크게 바꾸기 어렵다
- async로 바꾸기엔 비용이 크다
- 동기 API를 병렬로 처리해야 한다
threading은 구조적으로는 단순하지만, 락과 상태 공유 문제를 항상 함께 고려해야 합니다.
multiprocessing — CPU를 더 써야 할 때
multiprocessing은 프로세스를 여러 개 띄웁니다. 각 프로세스는 독립된 GIL을 가지기 때문에, 실제 CPU 병렬 실행이 가능합니다.
이 방식은 다음과 같은 상황에서 거의 유일한 선택지입니다.
- 대규모 수치 계산
- 이미지, 영상 처리
- 머신러닝 전처리
- CPU를 끝까지 써야 하는 작업
multiprocessing을 선택해야 하는 신호
- CPU 사용률을 더 올려야 한다
- 작업 하나하나가 무겁다
- 프로세스 간 데이터 복사 비용을 감당할 수 있다
단점도 분명합니다.
- 프로세스 생성 비용
- 데이터 직렬화 비용
- 디버깅 난이도
흔한 오해 정리
“async가 제일 빠르지 않나요?”
아닙니다. async는 빠르게 실행하는 기술이 아니라, 멈추지 않게 만드는 기술입니다.
“threading은 이제 안 쓰는 기술 아닌가요?”
여전히 매우 유용합니다. 특히 기존 동기 코드와 함께 사용할 때는 현실적인 선택입니다.
“multiprocessing은 무조건 느리지 않나요?”
CPU-bound 작업에서는 오히려 유일하게 성능을 올릴 수 있는 방법입니다.
선택을 위한 사고 흐름
마지막으로, 실무에서 써먹기 좋은 질문 흐름을 정리해보면 이렇습니다.
- 작업 대부분이 기다림인가? → asyncio
- 동기 코드를 그대로 병렬로 돌려야 하는가? → threading
- CPU를 더 써야만 해결되는 문제인가? → multiprocessing
이 질문 순서대로 생각하면, 선택이 크게 흔들리지 않습니다.
마무리
세 기술은 경쟁 관계가 아닙니다. 서로 다른 문제를 해결합니다.
- asyncio는 흐름을 다루고
- threading은 막힘을 나누고
- multiprocessing은 연산을 분산합니다
중요한 것은 “무엇이 더 최신인가”가 아니라,
“지금 내가 풀고 있는 문제가 무엇인가”
이 질문에 정확히 답하는 것입니다.
'IT' 카테고리의 다른 글
[DB] DB 인덱스와 쿼리 성능 (0) 2026.02.03 [Python] OAuth2와 JWT — 인증과 인가를 이해하는 올바른 시작점 (0) 2026.01.26 [Python] Async 코드가 느려지는 순간들 — 실무에서 가장 많이 하는 실수들 (0) 2026.01.23 [Python] 왜 Asyncio에는 Executor가 필요한가 — Async와 Cpu-bound의 경계 (0) 2026.01.23 [Python] 이벤트 루프는 어떻게 동작하는가 — Pseudo-code로 보는 Asyncio의 내부 (1) 2026.01.23