MJ's Blog
멀티스레딩, 멀티프로세싱, 비동기방식 비교 본문
특징 | 멀티프로세싱 (Multi Processing) | 멀티스레딩 (Multi Threading) | 비동기 (Async) |
동시성(Concurrency) | 여러 프로세스가 독립적으로 실행 | 하나의 프로세스 내에서 여러 스레드가 동시에 실행 | 단일 스레드에서 I/O 대기 시간 동안 다른 작업 수행 |
병렬성(Parallelism) | 실제 병렬 실행 (여러 CPU 코어 활용) | 제한된 병렬 실행 (GIL 제약이 있는 Python의 경우) | 병렬 실행이 아님 (동시성만 제공) |
실행 단위 | 프로세스 | 스레드 | 코루틴(Coroutine) |
메모리 공간 | 독립적인 메모리 공간 | 공유 메모리 공간 | 공유 메모리 공간 |
공유 자원 Lock 필요 | 거의 필요 없음 (프로세스 간 통신 필요) | 필수적 (공유 자원 접근 시 경쟁 상태 방지) | 협력적 멀티태스킹으로 인해 대부분 불필요 |
주 사용처 | CPU 집약적 작업, 병렬 계산 | I/O 작업과 CPU 작업이 혼합된 경우 | I/O 바운드 작업 (네트워크, 파일 I/O 등) |
핵심 모듈/키워드 | multiprocessing 모듈, ProcessPoolExecutor | threading 모듈, ThreadPoolExecutor | asyncio 모듈, async/await 키워드 |
동시성, 병렬성?
1.
"동시성"은 실제로는 한 번에 하나의 작업만 처리하고 있을 수 있으나, 작업 간 전환이 빠르게 일어나 동시에 실행되는 것처럼 보이는 것이며, "병렬성"은 실제로 여러 작업이 정확히 같은 시간에 실행되는 것. (즉, 여러 CPU코어를 사용하는 것임)
2.
이때 "병렬성"은 "동시성"에 포함되는 더 좁은 개념임.
즉 모든 병렬 시스템은 동시성을 가지나, 모든 동시성 시스템이 병렬성을 가지는 것은 아님.
3.
그래서 3가지 개념을 다시 정리해보자면,
- 멀티스레딩:
- 동시성 ✓: 여러 스레드가 번갈아 실행됨, 즉 동시성 있음
- 병렬성 △: Python의 GIL 때문에 CPU 작업에서는 제한적이지만, I/O 작업에서는 효과적인 병렬 처리가 가능. 그래서 병렬성은 애매함
▶GIL은 한 번에 하나의 스레드만이 Python 코드를 실행할 수 있도록 하는 락(lock)
▶실제로 Python에서 CPU 연산(계산)을 수행할 때는 GIL 때문에동시에 여러 스레드가 Python 코드를 실행할 수 없음
▶그러나 I/O 작업 수행 시에는 Python이 일시적으로 GIL을 해제하고 I/O 작업에서는 병렬 처리가 가능하다는 것
- 멀티프로세싱:
- 동시성 ✓: 여러 프로세스가 독립적으로 실행됨. 즉 동시성 있음
- 병렬성 ✓: 여러 CPU 코어를 사용하여 실제로 동시에 작업을 처리. 즉 병렬성 있음
- 비동기 프로그래밍:
- 동시성 ✓: 코루틴 간 전환을 통해 여러 작업이 동시에 진행되는 것처럼 보임. 즉 동시성 있음
- 병렬성 ✗: 단일 스레드에서 실행되므로 실제 병렬 처리는 없음. 즉 병렬성 없음
공유 자원 Lock?
1.
작업이 독립적인가 아닌가에 따라 Lock의 필요여부가 나뉘게 되는것.
2.
그래서 케이스별로 정리해보면,
- 멀티프로세싱 : 각 프로세스가 독립적이므로 일반적으로 락이 필요하지 않음.
- 멀티스레딩 : 공유 자원에 접근할 때 경쟁 상태(race condition)를 방지하기 위해 락이 필수적
- 비동기 프로그래밍 : 협력적 멀티태스킹 방식으로 작동하므로 명시적인 전환 지점에서만 컨텍스트 전환이 일어나 대부분의 경우 락이 필요하지 않음.
'IT' 카테고리의 다른 글
Dockerfile 작성 연습 (0) | 2025.05.27 |
---|---|
AWS SageMaker (0) | 2022.05.17 |