코루틴에 대하여
코루틴(Coroutine)은 근래 들어 부상하고 있는 매커니즘 중 하나다.
코틀린의 코루틴, 파이썬의 표준 코루틴, 고의 고(Go)루틴, C++20의 코루틴 등등...
역사
하지만 코루틴은 생각보다 오래된 녀석이다. Melvin Conway라는 양반이 1958년에 정의했다고 한다.
뿐만 아니라 어셈블리로 코드를 작성하던 시기에는 일상적으로 사용되던 녀석이었고.
고급언어로 올라가면서 언어에서 지원되지 않아 한동안 쓰이지 않다가, 근래 이르러서야 활발히 지원되고 있는 것이다.
어원
코루틴은 협동하는 루틴이란 뜻이다.
코루틴의 co는 함께한다는 의미를 지닌 접두어다.

의미
일단 코루틴은 루틴(routine)이다. 함수의 일종이란 말이다.
하지만 코루틴은 일반적으로 로직의 정지(suspend) 및 재시작(resume)이 가능하단 점에서 일반적인 서브루틴과 다르다.
그리고 일반적으로 루틴과 그 안에 속하는 서브루틴은 일방적인 관계를 가진다. 항상 루틴에서 서브루틴을 호출하는 식이다.
하지만 코루틴은 그 관계가 완전히 다르다. 코루틴 A와 B가 있다면 그 둘은 서로가 서로의 서브루틴일 수 있으며, 서로를 호출할 수도 있다.
그리고 코루틴에는 몇가지 형태가 존재한다.
제너레이터 방식
코루틴 객체가 코루틴의 진행 상태를 저장하는 구조다.
제너레이터 함수에선 값을 반환하더라도 해당 함수가 정지된 후 반환되며.
그 정지된 위치를 저장해서 기억한다.
그리고 제너레이터 함수에 재진입할 경우, 정지된 위치에서 다시 시작하게 된다.
자바스크립트, 파이썬, 루비 등의 제너레이터가 있다.
이터레이터 패턴?
애매하긴 한데, 상태를 저장하고 순차적으로 값을 반환한다는 점에서는 제너레이터의 일종이라고 할 수도 있다.
리스트, 배열 등 순차적인 자료구조 구현에 사용된다.
async/await 방식
이건 위의 방식과는 사뭇 다르다.
async 함수는 비동기적으로 실행될 수 있으며, 해당 비동기 로직을 제어할 수 있는 객체를 반환한다. 이를 보통 Promise나 Future라고 칭한다.
await은 Promise 전달받고 해당 Promise의 로직이 끝날때까지 블러킹, 동기화를 해준다.
await가 일종의 정지(suspend)에 해당하고, Promise가 끝나면 자동으로 재시작(resume)되는 것이다.
이건 재진입을 조정하기 힘들다는 점에서 제너레이터 방식에 비해서는 좀 불편한 부분이 있다.
따로 상태를 저장하지 않아서 섬세한 제어가 어렵기 때문이다.
그래서 이 방식을 보통 Stackless 코루틴이라 부르기도 한다.
자바스크립트, 러스트 등에서 이러한 문법을 제공한다.
스레드?
코루틴은 일반적으로 사용되는 스레드와 유사하다. 마찬가지로 멀티태스킹에 최적화된 방법론이기 때문이다.
하지만 그 차이점 또한 극명한데.
네이티브 스레드는 보통 동기화 작업을 신경써서 해줘야 하며, OS에서 이에 대한 기능을 제공해야 하고, 동기화에 큰 비용이 든다. 그래서 스레드는 무겁다.
하지만 코루틴은 이러한 것이 없어도 간단한 스택 제어만으로도 동시성을 구현할 수 있다. (이게 진짜 하드웨어적 병행성을 의미하진 않는다.)
참조
https://en.m.wikipedia.org/wiki/Coroutine
https://medium.com/@jooyunghan/%EC%BD%94%EB%A3%A8%ED%8B%B4-%EC%86%8C%EA%B0%9C-504cecc89407