동기 / 비동기, 블로킹 / 논블로킹
동기와 비동기
- 동기(Synchronous): 요청한 작업을 완료 여부에 따라서 작업을 처리
- 비동기(Asynchronous): 요청한 작업을 완료 여부를 따지지 않고 작업을 처리
A, B, C라는 3개의 작업이 실행될 때 동기는 순차적으로 A -> B -> C 순으로 처리가 되지만 비동기는 순서가 보장되지 않고 무작위로 작업이 수행됩니다. (ex A -> C ->B or C -> B -> A ....)
// 동기
console.log("A");
console.log("B");
console.log("C");
// 결과값: A B C
// 비동기
fetch("https://google.com").then((response) => console.log("A");
fetch("https://google.com").then((response) => console.log("B"));
fetch("https://google.com").then((response) => console.log("C"));
// 결과값은 무작위
블로킹과 논블로킹
- 블로킹(Blocking): 작업 수행 중 다른 작업을 처리하기 위해 현재 작업을 블락 후 다른 작업이 완료되면 작업 재개
- 논블로킹(Non-Blocking): 작업 수행 중 다른 작업이 수행되어도 현재 작업을 블락하지 않고 다른 작업과 동시에 수행 가능
동기 / 비동기, 블로킹 / 논블로킹
동기 / 비동기, 블로킹 / 논블로킹을 조합하여 4가지 처리 방법을 사용할 수 있습니다.
동기 + 블로킹
동기 + 블로킹 조합은 다른 작업이 진행되는 동안 자신의 작업을 블로킹하고 다른 작업의 완료 여부를 받아 순차적으로 처리되는 방식으로 순차적인 의존성이 있는 작업을 수행할 경우 사용됩니다.
const file1 = fs.readFileSync("file1.txt", "utf-8");
const file2 = fs.readFileSync("file2.txt", "utf-8");
const file3 = fs.readFileSync("file3.txt", "utf-8");
동기 + 논블로킹
동기 + 논블로킹은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 다른 작업의 결과를 바로 처리하여 작업을 순차대로 수행하는 방식입니다.
동기 + 블로킹 방식과 동일하게 순차적인 의존성이 있는 작업을 수행할 경우 사용됩니다.
async function exampleFunction() {
await nonBlockingFunction();
}
async function nonBlockingFunction() {
// 내부로직은 비동기 + 논블로킹으로
}
비동기 + 논블로킹
비동기 논블로킹 조합은 다른 작업이 진행되는 동안에도 자신의 작업을 처리하고 다른 작업의 결과를 바로 처리하지 않아 작업 순서의 순차보장이 되지 않는 방식입니다. 순차적인 의존성이 없을 경우 사용됩니다.
fetch("https://google.com").then((response) => console.log("A");
fetch("https://google.com").then((response) => console.log("B"));
fetch("https://google.com").then((response) => console.log("C"));
비동기 + 블로킹
비동기 + 블로킹 조합은 다른 작업이 진행되는 동안 작업을 블로킹하고 다른 작업의 결과를 바로 처리하지 않아 작업의 순차 보장을 하지 않는 방식입니다.