1. Blocking vs Non-Blocking
Blocking : 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
Non-Blocking : 다른 주체의 작업에 관련없이 자신의 작업을 하는 것
→ 차이 : 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 볼 수 있다.
![]() |
![]() |
출처 : https://asfirstalways.tistory.com/348
2. Synchronous vs Asynchronous
동기(Synchronous) : 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미
비동기(Asynchronous) : 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미
Synchronous |
Asynchronous |
|
Blocking |
1. Sync + Blocking | 3. Async + Blocking |
Non-Blocking |
2. Sync + Non-Blocking | 4. Async + Non-Blocking |
1. Sync + Blocking : 요청을 하나씩 처리하고, 각 요청이 완료될 때까지 기다린다.
function syncBlocking() {
const result1 = longRunningTask(1); // 첫 번째 작업
const result2 = longRunningTask(2); // 두 번째 작업
console.log(result1, result2); // 결과 출력
}
function longRunningTask(param) {
let sum = 0;
for (let i = 0; i < 1000000; i++) { // 시간 오래 걸리는 작업
sum += i;
}
return sum + param;
}
syncBlocking();
2. Sync + Non-Blocking : 요청은 비동기적으로 처리되지만, 실행 흐름은 동기적으로 보인다.
function syncNonBlocking() {
console.log("Start");
setTimeout(() => {
console.log("Long task finished");
}, 2000);
console.log("End");
}
syncNonBlocking();
3. Async + Blocking : 비동기적으로 요청을 처리하지만, await를 사용하여 완료될 때까지 기다린다.
async function asyncBlocking() {
console.log("Start");
const result1 = await longRunningTask(1); // 비동기 작업 기다리기
const result2 = await longRunningTask(2); // 또 다른 비동기 작업 기다리기
console.log(result1, result2); // 결과 출력
}
async function longRunningTask(param) {
let sum = 0;
for (let i = 0; i < 1000000; i++) { // 시간이 오래 걸리는 작업
sum += i;
}
return sum + param;
}
asyncBlocking();
4. Sync + Non-blocking : 비동기 작업을 실행하고, 그 작업을 기다리지 않고 다른 작업을 진행한다.
function asyncNonBlocking() {
console.log("Start");
setTimeout(() => {
console.log("Long task finished");
}, 2000); // 비동기 작업 (넌블러킹)
console.log("End");
}
asyncNonBlocking();
동기와 비동기 차이는 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 '동기'라하고, 그렇지 않은 경우에 대해서 '비동기'라고 표현하는 것 같다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking 되어 있다는 것의 의미한다. 비동기의 경우, blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.
→ Blocking / Non-Blocking은 제어의 관점, Sync / Async은 순서와 결과(처리)의 관점이라 생각하자.