
async, sync개념은 비동기 처리를 하다보면 해당 개념에 대해서 접해볼 기회가 수두룩 할 것이다. 다만 JavaScript포함한 다른 언어에서 Blocking, Non-Blocking개념이 기본적으로 가미되어 있는데 해당 개념들은 대체 무엇이고 async, sync과의 차이점은 무엇인지 알아보자
async이 어떤 개념인지 알아보기 전에 해당 단어의 뜻을 알아보자
async은 "규칙적인 시간 관계가 없는것" 즉, 어떠한 일들이 발생하는 순서가 서로간의 시간 관계 없이 일어나는 것을 의미한다.
예를 들어 A,B,C 업무가 있다고 생각해보자
위와같이 A,B,C 업무가 서로간의 시간관계없이 진행되는걸 의미한다.
이 말은 동시다발적으로 세 개의 업무가 진행될수도 있는것이고 혹은 아래 예시처럼 "A"라는 업무가 끝나고 바로 "C"업무가 시작되는게 아닌 잠시 텀을 뒀다가 "C"업무가 발생하는 도중에 "A"업무가 진행될수도 있는 것이다.
console.log("Start");
setTimeout(() => {
console.log("hello..?");
}, 3000);
console.log("End");
JavaScript에서는 setTimeout가 비동기(Async)로 동작하는 함수의 대표적인 예이다.
그럼 sync(Synchronous)는 어떤 개념일까?
"동시에 발생하지 않는" 즉, 동시에 2개 이상의 일이 진행되지 않는 것이다.
console.log("Start");
console.log("hello..?");
console.log("End");
위와같이 제일 위부터 제일 아래까지 순차적으로 로직이 실행되는걸 확인할 수 있다.
여기서 캐치해야 할 점은 Async, sync의 큰 차이점은 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지로 판단할 수 있다는 점이다. 결과라는 점에 주목해보자.
또한 여기서 알 수 있는 부분은 JavaScript는 특별한 메서드나 문법을 사용하지 않는 한 동기적으로 동작하는 언어라는걸 알 수 있다.
그럼 대체 Blocking, Non-Blocking개념이 뭘까?
Blocking은 말 그대로 블록하는 것이다. 즉, 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것이다.
위와같이 "H1"에서의 "A"작업에서 먼저 "제어권"을 가지고 있다가 "A"가 끝나면 "H2"의 "B"로 "제어권"을 넘겨준다. "B"작업이 완료된다면 "C"작업으로 "제어권"을 넘겨준다.
여기서 Blocking의 중요한점은 제어권을 넘긴다면 제어권을 넘긴 함수는 동작을 멈추게 된다.
그와 반대로 제어권이 없던 "H2"함수는 동작을 멈춘상태로 있다가 "H1"함수로부터 제어권을 받으면 동작한다.
위와같이 Blocking은 제어권을 누가 가지고 있냐에 따라서 제어권을 가지고 있는 함수가 동작을 하고 제어권이 없는 함수는 동작을 하지 않는 형태이다.
Non-Blocking은 블록하지 앟는것이다. 즉, 자신의 작업을 진행하다가 다른 주체의 작업이 시작되어도 제어권은 본인이 가진채로 "H2"도 동작하는 상태에서 본인의 작업도 이어나가는 것이다.
"H1"에서 "H2"를 호출하여도 제어권은 그대로 "H1"에게 있고 "H2"를 동작시키는 것이다.
Blocking과 Non-Blocking은 다른 주체가 작업할 때 자신한테 제어권이 있는지 없는지가 둘의 큰 차이점이라고 볼 수 있다.
둘의 큰 차이는 결국 "제어권"을 주고받냐와 작업의 처리 위치에 따른 결정이 제일 큰 차이점인거 같다.
즉, Blocking에서 제어권을 주고 받는다는건 제어권이 없는 상태에서는 해당 함수의 동작이 멈추고 제어권을 다시 받을때까지 기다리지만
sync같은 경우는 제어권을 주고받는게 아닌 함수간의 시작과 끝을 기다리는 상태이다. 여기서 기다린다는 뜻은 동작이 멈춘다는 뜻이 아니다. 작업의 처리 위치에 따라서 결정되는게 async인 것이다.
포스팅으로 정리하기 전에는 async, sync와 blocking, Non-Blocking의 차이에 대해서 애매하게 이해하고 있었는데 확실히 두 개념은 유사해보이지만 분명한 차이가 존재했다.
다만 공부하면서 느낀건 Blocking, Non-Blocking은 I/O의 관점에서 봐야 이해가 수월했다.
실제로 여러 자료를 보면 파일 입출력하는 예제를 토대로 Blocking, Non-Blocking의 예시를 보여주는 자료들이 많았다.
다음 포스팅에서는 끔찍하게도 async,sync 와 Blocking, Non-Blocking의 조합에 대해서 알아보자
https://www.youtube.com/watch?v=oEIoqGd-Sns&t=1s
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC
https://www.slipp.net/questions/367