
Coroutine(코루틴)은 프로그램 실행 흐름의 한 단위를 표현하는 개념으로, 실행을 일시 중단(suspend)하고 나중에 그 지점부터 재개(resume)할 수 있는 함수나 루틴을 말합니다. 일반적인 함수 호출과 달리 코루틴은 자신이 멈춘 위치의 상태(로컬 변수, 명령 포인터 등)를 보존하고 필요할 때 제어권을 반환하거나 되찾을 수 있으므로 협력적(cooperative)인 멀티태스킹을 구현하기에 적합합니다. 주요 특징 - 일시 중단과 재개: 코루틴은 명시적 지점에서 실행을 멈추고(예: await, suspend), 나중에 같은 지점부터 계속 실행할 수 있습니다. - 상태 보존: 중단 시 로컬 상태를 보존하므로 복잡한 상태 기계(state machine)를 직접 구현하지 않아도 됩니다. - 경량성: 스레드보다 메모리·오버헤드가 적어 많은 수를 생성해도 효율적입니다(스택 크기 및 스케줄링 비용이 작음). - 협력적 스케줄링: 보통 코루틴 자신이 중단 지점을 명시적으로 선택하므로 컨텍스트 전환이 스레드의 강제(preemptive) 전환보다 덜 비용이 듭니다. 코루틴 vs 스레드 - 스레드: 커널(또는 런타임)이 스레드를 선점(preemptively)해서 스케줄링. 각 스레드는 독립적이며 동시성 문제(락, 뮤텍스 등)가 자주 발생. - 코루틴: 개발자가 중단 지점을 제공하며 같은 스레드에서 여러 코루틴이 협력적으로 실행될 수 있음(단일 스레드 이벤트 루프 위에서 작동하는 경우가 많음). 동시성은 제공하지만 항상 병렬성(동시에 여러 CPU 코어 사용)을 의미하지는 않음. - 가벼움: 코루틴은 일반적으로 스레드보다 훨씬 가벼움. 많은 코루틴을 만들어도 스레드만큼 비용이 높지 않음. 스택풀 vs 스택리스 - 스택풀(stackful) 코루틴: 호출 스택 전체를 저장하여 깊게 호출된 함수들 사이에서도 자유롭게 일시 중단/재개 가능. 구현이 복잡하지만 더 유연. - 스택리스(stackless) 코루틴: 명시적 중단 지점(suspend/await)에서만 중단 가능. 대부분 현대 언어의 async/await는 스택리스 스타일. 스케줄링 모델 - 단일 스레드 이벤트 루프: Node.js, Python asyncio 같은 모델. 많은 비동기 작업을 하나의 스레드로 효율적으로 처리. - 런타임 스레드 풀 + 코루틴: Kotlin의 코루틴 디스패처처럼 여러 스레드에서 코루틴을 스케줄해 병렬성도 제공 가능. - 유저 레벨 스케줄러: 코루틴 런타임이 직접 코루틴을 관리. 언어별 예시 (간단) - Python (asyncio) async def fetch(): await asyncio.sleep(1) return "done" - JavaScript async function fetchData() { await fetch(url); return result; } - Kotlin suspend fun fetch(): String { delay(1000) return "done" } GlobalScope.launch { val r = fetch() } 주의사항과 단점 - 동시성 vs 병렬성: 코루틴은 자동으로 병렬화를 보장하지 않음. CPU 바운드 작업은 별도 스레드/풀로 옮겨야 함. - 자원 관리와 취소: 코루틴을 취소하거나 타임아웃을 처리할 때 명시적 취소 협약이 필요(취소 불응적 코루틴은 문제를 일으킴). - 디버깅: 비동기 제어 흐름 때문에 스택 트레이스와 디버깅이 복잡해질 수 있음. - 상호 운용성: C 라이브러리 호출 등에서 중단 지점이 없는 경우 설계에 제약이 있음(특히 스택리스 코루틴). 실무에서의 사용처 - I/O 중심 서버(네트워크, 파일)에서 많은 동시 연결을 처리할 때(고성능 비동기 서버). - UI 응답성 유지(백그라운드에서 작업을 수행하고 중단/재개). - 비동기 파이프라인과 스트림 처리. - 복잡한 비동기 상태 기계의 단순화. 요약 코루틴은 일시 중단과 재개가 가능한 경량 실행 단위로, 협력적 멀티태스킹을 통해 비동기 코드와 많은 동시 작업을 효율적으로 처리할 수 있게 해 줍니다. 스레드와 비교해 메모리·스케줄링 오버헤드가 작고 언어별로 다양한 구현(스택풀/스택리스, 이벤트 루프/스레드 풀 통합)이 존재합니다.