Blocking과 Non-Blocking, Sync와 Async 언뜻 보면 비슷한 개념으로 느껴질 수도 있다.
하지만 제어권
, 결과값에 대한 관심도
라는 관점에서 살펴보면 둘은 명확히 다른 개념이다!
Blocking, Non-Blocking
다른 주체가 작업할 때 자신의 제어권이 없는지 or 있는지
Sync, Async
호출한 함수의 결과에 관심이 있는지 or 없는지
Blocking, Non-Blocking
💡 제어권의 주체를 넘기느냐 안 넘기느냐
Blocking
제어권을 넘기고 제어권을 다시 돌려받을 때까지 기다렸다가 돌려받고 동작을 시작
![](https://velog.velcdn.com/images/funnysunny08/post/27c4a127-6d66-414c-a118-f01e4053d541/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 제어권을 B에게 넘긴다.
- B를 실행한다. (이때 A는 제어권이 없기 때문에 실행할 수 없다.)
- B의 실행이 끝나면 제어권을 다시 A에게 돌려준다.
- 제어권을 돌려받은 A는 다시 실행한다.
Non-Blocking
제어권을 넘기지 않고 동작
![](https://velog.velcdn.com/images/funnysunny08/post/a1106dd3-0a33-42b9-878c-1108b4a8ca5a/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 제어권을 넘기지 않는다.
- B를 실행하고, A는 자신이 가진 제어권으로 계속 실행한다.
Sync vs Async
💡 호출되는 함수의 작업 완료 여부를 신경 쓰냐 안 쓰냐
Sync(동기)
함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값을 계속 확인하면서 신경쓰는 것
Async(비동기)
함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행
함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.
Blocking/Non-Blocking, Sync/Async 조합!
1. Blocking/Sync
![](https://velog.velcdn.com/images/funnysunny08/post/8ae39d09-551d-45c8-adac-36a6ae0e2233/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 제어권을 B에게 넘긴다.
- B를 실행한다. (이때 A는 제어권이 없기 때문에 실행할 수 없다.)
- B의 실행이 끝나면 제어권과 결과값을 A에게 돌려준다.
- 제어권을 돌려받은 A는 B의 결과값을 참고하여 다시 실행한다.
2. Non-Blocking/Sync
![](https://velog.velcdn.com/images/funnysunny08/post/0706ff3c-3893-489d-9b5a-bbb909d85d6e/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 제어권을 넘기지 않는다.
- B를 실행하고, A는 자신이 가진 제어권으로 계속 실행한다.
- 이때 A는 B의 결과값이 필요하기 때문에 자신의 코드를 실행하면서, 중간중간 B에게 완료 여부를 물어본다.
3. Blocking/Async
![](https://velog.velcdn.com/images/funnysunny08/post/f5403790-7b4a-4291-803e-7cb7d617d7b6/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 제어권과 콜백함수를 B에게 넘긴다.
- B를 실행한다. (이때 A는 제어권이 없기 때문에 실행할 수 없다.)
- B의 실행이 끝나면 콜백함수를 호출하면서 제어권을 다시 돌려준다.
- 제어권을 돌려받은 A는 다시 실행한다. (이때 B의 결과값 관심 X)
4. Non-Blocking/Async
![](https://velog.velcdn.com/images/funnysunny08/post/81d6d31c-a397-40e6-8668-b3f51a02ba4a/image.png)
- 함수 A를 실행하다 B를 호출한다. 이때 콜백함수만 넘긴다.
- B를 실행하고, A 또한 자신이 가진 제어권으로 계속 실행한다.