sync vs async, blocking vs non-blocking 차이
재직중인 회사에서 네이버사 연계중 초당 10회의 제한있어 이를 처리 하는 로직을 수정을 진행 하였고 동기, 비동기, 블로킹, 논블로킹을 다시 리마인드 할겸 정리를 한다.
동기/비동기 와 블로킹 논블로킹 이 두 개념은 표현 형태는 비슷해 봉리지라도, 서로 다른 차원에서 작업의 수행방식을 설명하는 개념이다.
작업을 순차적으로 수행할지 아닌지에 대한 관점이고, 블로킹/ 논블로킹은 단어 그대로 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다.
1.동기(sync) 와 비동기 (Async)
Synchronous의 Syn는 그리스어로 '함께'이란 뜻이고 chrono는 '시간'이라는 뜻이다.
즉, Synchronous는 작업 시간을 함께 맞춰서 실행한다 라는 뜻으로 해석된다. 작업을 맞춰 실행한다는 말은 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것을 말한다.
Asynchronous는 앞에 A라는 접두사가 붙어 부정하는 형태이다. 그래서 동기와 반대로 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수행하게 된다.
비동 기 처리 이점
위와 같이 순차처리 와 다르게 비동기 처리시 Task1이 끝나는 시점에 끝나기 떄문에 2배 이상 빠른 처리 가능
2. 블로킹(Blocking)과 논블로킹(Non-Blocking)
현재 작업을 차단 혹은 대기 하냐 안하냐의 차이를 나타내는 프로세스 실행 방식.
동기/비동기가 전체 작업의 순차 흐름 유무. 블로킹/논블로킹 은 전체 작업의 흐름 자체를 막냐 안막냐 의 차이이다.
비동기와 논블로킹의 차이
console.log("시작");
setTimeout(() => {
console.log("0.5초 비동기/ 논블로킹");
}, 500);
console.log("끝");
script setTimeout 을 예를 들면
출력 순서와 정의된 코드 라인 순서가 맞지 않은 것이다.
이는 setTimeout 함수에 대해 타이머 작업 완료 여부를 신경 쓰지 않고 바로 그 다음 콘솔 작업을 수행하였기 때문이다. 그리고 setTimeout 함수의 타이머 작업 완료 알람을 콜백 함수를 통해 값을 받아 출력하였다. 따라서 setTimeout 은 비동기(Asynchronouse)이다.
setTimeout 함수는 자신의 타이머 작업을 수행하기 위해 메인 함수를 블락하지 않고 백그라운드에서 별도로 처리되었다. 메인 함수를 블락하지 않으니 setTimeout 함수를 호출하고 바로 그 다음 콘솔 함수를 호출한 것이다. 따라서 setTimeout 은 논블로킹(Non-blocking)이다.
3. 동기/비동기 + 블로킹 논블로킹
- Sync Blocking(동기 + 블로킹)
- Async Blocking(비동기 + 블로킹)
- Sync Non-Blocking(동기 + 논블로킹)
- Async Non-Blocking(비동기 + 논블로킹)
Sync Blocking
다른 작업이 진행되는 동안 자신의 작업을 처리하지 않고(Blocking) 다른 작업의 완료 여부를 바로 받아 순차적으로 처리하는 방식
Async Non-Blocking
다른 작업이 진행되는 동안에도 자신의 작업을 처리하고( Non Blocking), 다른 작업의 결과를 바로 처리하지 않아 작업 순서가 지켜지지 않는 Async 방식
Sync Non-Blocking
다른 작업이 진행되는 동안에도 자신의 작업을 처리하고( Non Blocking)
다른 작업의 결과를 바로 처리하여 작업을 수낯대로수행하는 sync 방식
async Blocking
다른 작업이 진행되는 동안 자신의 작업을 멈추고 기다리는( Blocking), 다른 작업의 결과를 바로 처리하지 않아 순서대로 작업을 수행하지 않는 Async 방식 (실제 로 sync blocking 과 큰 차이가 없고 작업할때 볼일이 없을 듯 하다).