코루틴 (coroutine)
쉽게 풀면
보통의 함수는 한 번 호출하면 끝까지 실행되고 반환하면 그 안의 상태는 사라집니다. 코루틴은 중간에 “여기서 잠깐 멈추고 제어를 넘기겠다”고 선언할 수 있고, 나중에 다시 부르면 멈춘 그 자리에서 지역 변수까지 그대로 살아난 채 이어집니다. 여러 코루틴이 번갈아 조금씩 진행하면 스레드 하나로도 동시성이 흉내 내집니다.
왜 중요한가
운영체제 스레드보다 훨씬 가볍기 때문에 수십만 개를 동시에 띄울 수 있어, 네트워크 서버처럼 대기가 많은 작업의 동시성 비용을 크게 낮춥니다. 콜백을 중첩해 쓰던 비동기 코드를 순차적으로 읽히는 형태로 되돌려 주어 가독성 문제도 해결합니다. 오늘날 주요 언어들이 async/await 형태로 이를 기본 제공합니다.
논문에서는 이렇게 쓰입니다
기다리는 동안 스레드를 붙잡지 않게 해 더 많은 접속을 동시에 처리했다는 뜻입니다.
조금 더 깊게 보면
중단과 재개는 상태 기계로 변환하는 컴파일러 기법이나 별도의 스택을 두는 방식으로 구현되며, 전자를 스택 없는 코루틴, 후자를 스택 있는 코루틴이라 부릅니다. 제어 전환이 커널을 거치지 않으므로 컨텍스트 스위칭보다 비용이 훨씬 작습니다. 전환 시점이 명시적인 지점에서만 일어나는 협조적 방식이라, 중단점 없이 오래 계산하는 코루틴 하나가 전체를 굶길 수 있어 스케줄러 설계가 중요합니다.
주의할 점
비동기 처리와 이벤트 루프가 대기 중인 작업을 스케줄링하는 실행 엔진이라면, 코루틴은 그 위에서 멈추고 재개되는 코드 단위라는 점에서 층위가 다릅니다. 여러 코루틴이 실제로 동시에 계산을 수행하는 것은 아니므로 병렬 처리와 혼동해서는 안 됩니다.