이 주제를 공부할 때 유의해야 할 점이 하나 있다. 동기와 블로킹, 비동기와 논블로킹을 비슷한 것으로 오해하고 있는데, 이 두가지 개념은 서로 전혀 다른 곳에 초점을 둔 개념이다. 단지 조합하여 사용되는 것뿐이다.
동기와 비동기는 프로세스의 수행 순서 보장
에 대한 매커니즘이고, 블로킹과 논블로킹은 프로세스의 유휴 상태
에 대한 개념이다.
선행지식
- 프로세스와 스레드
- 제어권 : 자신(함수)의 코드를 실행할 권리 같은 것. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
- 결과값을 기다린다는 것 : A 함수에서 B 함수를 호출했을 때, A 함수가 B 함수의 결과값을 기다리느냐의 여부.
Blocking vs Non-Blocking
- 블로킹과 논블로킹을 논할 때, 처리하는 작업이 전체적인 작업 흐름을 막는지에 대해 생각한다.
- 즉,
제어권
이 누구한테 있느냐가 관심사이다.
블로킹
- 자신의 작업을 진행하다가, 다른 주체의 작업이 시작되면 자신의 작업을 멈추고 해당 작업을 기다렸다가 다시 자신의 작업을 시작한다.
- A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B 함수에 넘겨준다.
논블로킹
- 다른 주체의 작업에 관련없이 자신의 작업을 한다.
- A 함수가 B 함수를 호출해도, 제어권은 A 함수가 그대로 갖고 있는다.
- B 함수는 호출되어 실행되는 동시에, A 함수가 제어권을 계속 가지기 때문에 자신의 코드를 계속 실행한다.
Sync vs Async
- 처리해야 할 작업들을 어떠한
흐름
으로 처리할 것인가에 대한 관점
- 다른 말로는 호출하는 함수의 작업 완료 여부를 신경쓰는지에 대해 생각한다.