DEV

동기 / 비동기, 블로킹 / 논블로킹

KMSEOP 2023. 9. 23. 19:02
728x90

동기와 비동기

- 동기(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"));

 

비동기 + 블로킹

비동기 + 블로킹 조합은 다른 작업이 진행되는 동안 작업을 블로킹하고 다른 작업의 결과를 바로 처리하지 않아 작업의 순차 보장을 하지 않는 방식입니다.

728x90