동기는 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 방식이다.
요청한 작업이 끝나야 다음 작업이 이루어지기 때문에 어떤 작업이 수행 중이면 다음 작업은 대기하게 된다.
비동기는 기본 프로그램 흐름과 독립적인 이벤트를 발생하고, 이러한 이벤트를 처리하는 방법을 나타낸다.
동기와 반대로 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 대기하지 않고 바로 다음 작업을 수행한다.
동기 방식
비동기 방식
다른 요청의 작업을 처리하기 위해 현재 작업을 block(차단, 대기) 하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식이다.
누가 제어권을 가지고 있냐로도 구분할 수 있다.
제어권을 계속 가지고서
호출한 함수에게 바로 돌려주지 않으면 Block
바로 제어권을 건네주어(return)
호출한 함수가 다른 일을 진행할 수 있도록 해주면 Non-block
동기 + 블로킹
function run(a, b) {
return a + b
}
const result = run(1, 2);
console.log("시작");
console.log("결과:", result);
console.log("끝");
비동기 + 논블로킹
function run(a, b) {
return a + b
}
let result;
setTimeout(() => {
result = run(1, 2);
}, 1000);
console.log("시작");
console.log("결과:", result);
console.log("끝");
동기 + 논블로킹
호출되는 함수는 바로 리턴하고, 호출하는 함수는 작업 완료 여부를 신경쓰는 것이다. 신경쓰는 방법이 기다리거나 물어보거나 두 가지가 있는데, Non-Blocking 함수를 호출했다면 사실 기다릴 필요는 없고 물어보는 일이 남는다.
즉, Non-Blocking 함수 호출 후 바로 반환 받아서 다른 작업을 할 수 있게 되지만, 함수 호출에 의해 수행되는 작업이 완료된 것은 아니며, 호출하는 함수가 호출되는 함수 쪽에 작업 완료 여부를 계속 묻는다.
someTask = asyncFunction();
while(someTask.isDone()){
// 작업 완료 여부를 계속 묻기
// 다른 작업 수행 가능
}
// 작업 완료되면 작업 결과에 따른 작업 수행
비동기 + 블로킹
참고
더 알아보기