코루틴(Coroutine)은 실행을 일시 중단하고 다른 코루틴에 제어를 넘겼다가 재개할 수 있는 서브루틴의 일반화다. 제너레이터보다 발전된 개념으로, 비동기 프로그래밍과 협력적 멀티태스킹의 기반이다.
서브루틴 vs 코루틴
서브루틴 (일반 함수):
호출 → 실행 → 반환 (단방향)
코루틴:
실행 중 yield/suspend → 대기
다른 코루틴 실행 → 재개
(양방향 제어 흐름)
Python async/await 코루틴
python
import asyncio
async def download(url, delay):
print(f"시작: {url}")
await asyncio.sleep(delay) # 비동기 대기 (다른 코루틴에 양보)
print(f"완료: {url}")
return f"data:{url}"
async def main():
# 두 코루틴 동시 실행
results = await asyncio.gather(
download("url1", 2),
download("url2", 1),
)
# url2가 먼저 완료 (1초), url1이 나중 (2초)
# 총 ~2초 (순차라면 3초)
asyncio.run(main())
kotlin
import kotlinx.coroutines.*
fun main() = runBlocking {
val job1 = launch {
delay(2000)
println("Job 1 done")
}
val job2 = launch {
delay(1000)
println("Job 2 done")
}
job1.join()
job2.join()
// 총 ~2초
}
코루틴 vs 스레드
| 항목 | 코루틴 | 스레드 |
|---|
| 메모리 | ~수 KB | 18 MB |
| 전환 비용 | 매우 낮음 (협력적) | 높음 (선점적) |
| 동시 수 | 수백만 가능 | 수천이 한계 |
| 공유 자원 | 대부분 안전 | 뮤텍스 필요 |
| 적합 | I/O 바운드 | CPU 바운드 |
관련 개념