Coroutine과 Generator에 대해 많이 듣게 되었다. 이 참에 정리하려고 한다.
동시성은 동시에 task를 동시에 처리하는 것이 아니라 동시에 처리하는 것처럼 보이는 것을 의미한다. 이는 여러가지 task를 옮겨 다니면서(Context switch) 실행하여 구현한다. 보통 일꾼이 한 명이 여러가지 일을 돌아가면서 수행하는 것을 의미한다.
병렬성은 Multi Thread환경에서 여러가지 일을 동시에 실행하는 것을 의미한다. 일꾼이 여럿이라고 생각하고 동시에 여러가지 일을 수행하는 것이다.
coRoutine은 co(함께)+routine(루틴)으로 서로 협동하는 루틴을 의미한다. 원래 루틴의 제어 흐름은 루틴을 호출하고 그 루틴을 종료한 후, 다시 메인으로 돌아오는 것이 일반적이다. 하지만 coroutine은 호출한 flow가 특정 루틴을 호출하고 일정 부분 루틴을 실행한 후 suspend하여 원래 메인 flow로 돌아올 수 있게 된다. 그리고 다시 routine을 불러 resume도 할 수 있게 된다. 이렇게 task를 주고 받으면서 여러가지 일을 동시에 하게 하는 것이 coroutine을 통해 concurrent를 구현하는 것이다.
Generator는 coroutine을 구현하기 위해 좋은 도구이다.
Generator는 yield키워드와 함께 제어권을 바깥으로 넘기고 next()호출로 제어권을 루틴 안으로 보낼 수 있다. 이러한 방식을 사용하면 깔끔한 코드를 짤 수 있게 된다.