ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] Asyncio Vs Threading Vs Multiprocessing — 무엇을 선택해야 할까
    IT 2026. 1. 23. 11:41

    무엇을 선택해야 할까

    파이썬에서 동시성 이야기를 시작하면 반드시 마주치는 질문이 있습니다.

    “이건 asyncio로 해야 하나요, threading으로 해야 하나요?” “multiprocessing은 언제 쓰는 거죠?”

    이 질문이 어려운 이유는, 세 기술이 겉으로는 비슷해 보이지만 전혀 다른 문제를 해결하기 때문입니다. 이 글에서는 성능 비교보다는, 사고 기준을 중심으로 어떤 상황에서 무엇을 선택해야 하는지 정리해보겠습니다.


    먼저 한 문장으로 요약하면

    • asyncio기다림을 잘 다루기 위한 도구입니다
    • threading막아두지 않고 같이 일하게 하는 도구입니다
    • multiprocessingCPU를 더 쓰기 위한 도구입니다

    이 문장을 이해하면 선택의 절반은 끝난 셈입니다.


    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 작업에서는 오히려 유일하게 성능을 올릴 수 있는 방법입니다.


    선택을 위한 사고 흐름

    마지막으로, 실무에서 써먹기 좋은 질문 흐름을 정리해보면 이렇습니다.

    1. 작업 대부분이 기다림인가? → asyncio
    2. 동기 코드를 그대로 병렬로 돌려야 하는가? → threading
    3. CPU를 더 써야만 해결되는 문제인가? → multiprocessing

    이 질문 순서대로 생각하면, 선택이 크게 흔들리지 않습니다.


    마무리

    세 기술은 경쟁 관계가 아닙니다. 서로 다른 문제를 해결합니다.

    • asyncio는 흐름을 다루고
    • threading은 막힘을 나누고
    • multiprocessing은 연산을 분산합니다

    중요한 것은 “무엇이 더 최신인가”가 아니라,

    “지금 내가 풀고 있는 문제가 무엇인가”

    이 질문에 정확히 답하는 것입니다.

Designed by Tistory.