https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/

Blocking

Blocking은 Node.js 프로세스에서 추가 JavaScript 실행이 JavaScript가 아닌 작업이 완료될 때까지 기다려야 하는 경우입니다. 이는 Blocking 작업이 발생하는 동안 이벤트 루프가 JavaScript를 계속 실행할 수 없기 때문에 발생합니다.

Untitled

Blocking Function

JSON.stringfy 함수와 window.alert 는 Blocking 함수입니다.

해당 작업을 마쳐야 다음 작업을 수행할 수 있습니다.

Node.js에 있는 Blocking 메서드

const fs = require("fs");
const data = fs.readFileSync("README.md"); // blocks here until file is read
console.log(data);

// will run after console.log

Node.js 표준 라이브러리의 모든 I/O 메서드는 non-blocking 및 callback 함수를 허용하는 비동기 버전을 제공합니다. 일부 메서드에는 이름이 Sync로 끝나는 차단 상대도 있습니다.

Non-Blocking Method 사용

fs.readFile("README.md", (err, data) => {
  if (err) throw err;
  console.log(data);
});
// will run before console.log

첫 번째 예는 두 번째 예보다 간단해 보이지만 두 번째 줄이 전체 파일을 읽을 때까지 추가 JavaScript 실행을 차단하는 단점이 있습니다. 동기식 버전에서는 오류가 발생하면 이를 잡아야 하며 그렇지 않으면 프로세스가 중단됩니다. 비동기 버전에서 표시된 대로 오류를 발생시켜야 하는지 여부는 작성자가 결정합니다.

Blocking 코드와 Non-Blocking 코드를 함께 쓸 때 발생할 수 있는 문제

fs.readFile("README.md", (err, data) => {
  if (err) throw err;
  console.log(data);
});
fs.unlinkSync("README.md");

Untitled

위의 예에서 fs.unlinkSync()는 실제로 읽히기 전에 README.md를 삭제하는 fs.readFile()보다 먼저 실행될 가능성이 높습니다.

fs.readFile("README.md", (read_err, data) => {
  if (read_err) throw read_err;
  console.log(data);

  fs.unlink("README.md", (unlink_err) => {
    if (unlink_err) throw unlink_err;
  });
});

위의 내용은 올바른 작업 순서를 보장하는 fs.readFile()의 콜백 내에서 fs.unlink()에 대한 non-blocking 호출을 배치합니다.