글의 목적
코루틴을 공부하며 헷갈렸던 동기/비동기, 블로킹/논블로킹 개념을 까먹지 않도록 정리한다.
동기와 비동기를 나누는 포인트 : 루틴이 서브루틴의 작업 종료를 신경 쓰는가?
Sync(동기)
루틴이 서브루틴을 호출하고, 끝날 때까지 기다린다.
서브루틴의 시작과 종료가 루틴의 작업 흐름에 영향을 준다.
Async(비동기)
루틴이 서브루틴에게 작업을 위임(callback 전달)하고 종료 여부를 신경 쓰지 않는다.
서브루틴은 루틴에게 callback 작업을 받아 수행한다.
이어달리기를 상상해 보자.
동기(Sync)란 한 선수가 바통을 전달하기 전까지 다음 선수가 대기하는 것과 같다. 이전 선수의 달리기가 완료되어야만 다음 달리기가 시작되며, 이는 순차적으로 진행된다.
반면, 심판과 선수들의 관계는 비동기(Async)이다. 심판은 선수에게 '달리기를 시작해라'라는 출발 신호를 전달하지만, 이후 선수가 출발했는지, 넘어졌는지에는 관여하지 않는다. 필요한 경우 선수는 자신의 상태를 callback으로 심판에게 알릴 수 있다.
blocking과 non-blocking을 나누는 포인트 : 루틴과 서브루틴 중 제어권이 누구에게 있는가?
blocking
제어권이 서브루틴에게 있음.
루틴은 서브루틴의 작업이 끝날 때까지 기다리며, 다른 작업을 하지 못함.
non-blocking
제어권이 루틴에게 있음.
서브루틴이 작업 요청을 받은 후 즉시 제어권을 반환하므로 루틴은 다른 작업을 수행할 수 있음.
이제 가장 많이 비교되는 동기 + blocking 조합과 비동기 + non-blocking 조합을 살펴보자.
아래 그림에서 화살표는 실행 흐름(제어권)의 이동을 나타내며, 진한 색 부분은 제어권을 갖고 있는 상태를 나타낸다.
동기 실행이므로, 루틴은 서브루틴이 종료될 때까지 기다린다.
그동안 제어권은 서브루틴이 갖기 때문에 루틴은 blocking된 상태이다.
비동기 실행이므로, 루틴은 서브루틴을 실행하고 종료 여부를 신경쓰지 않는다.
또한 서브루틴은 유휴 시간 동안 루틴에게 제어권을 양보하기 때문에 non-blocking 하게 협력적으로 실행된다.

언제 업로드 되나요?