
| 코루틴(Coroutine) | Virtual Thread | |
|---|---|---|
| 스레드 모델 | 기존 스레드 풀에서 코루틴을 실행 | 새로운 사용자 모드 스레드 |
| 멀티태스킹 방식 | 협력적 (중단된 Coroutine을 다른 스레드에서 실행 가능) | 선점형(Preemptive) |
| 중단 방식 | suspend 키워드로 명시적으로 중단 | I/O 블로킹 시 자동으로 suspend & resume |
| 메모리 사용량 | 매우 적음(스택 저장 방식) | 기존 OS 스레드보다 적지만, 코루틴보다는 큼 |
| 컨텍스트 스위칭 비용 | 매우 낮음(둘 다 커널모드 전환이 일어나지 않고 힙에 저장하는 방식) | 낮지만, 코루틴보다는 높음 |
| 스케줄링 방식 | 스케줄링 방식 | OS 스레드 기반의 ForkJoinPool 활용 |
| 선택 기준 | CPU 바운드 작업 (계산량 많음) | I/O 바운드 (네트워크, 파일) |
| 사용 용도 | 비동기 UI 렌더링 | 멀티스레딩이 필요한 대규모 I/O 바운드 작업 |
suspend keyword를 사용하면 메서드 호출시 기본 스레드가 차단되지 않는다.
interface GitHubService {
@GET("orgs/{org}/repos?per_page=100")
suspend fun getOrgRepos(
@Path("org") org: String
): List<Repo>
}
코루틴이 CPU 바운드 작업에 적합하다는 설명은 Dispatchers.Default 기준일까요?
본문에 없는 내용 중 중요한 점이 하나 있는데 코루틴은 suspend가 전파되기 때문에 함수 색상 문제를 가진다는 점도 유의해야합니다.
추가로 virtual thread를 사용하는 custom dispatcher를 정의하면 코루틴 자체가 vt에서 동작하도록 처리할 수도 있습니다.