이 글은 Node.js의 공식문서를 참고하여 작성한 글입니다.
(출처:https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking)
블로킹이란 Node.js 프로세스에서 추가적인 JS의 실행을 위해 JS가 아닌 작업이 완료될 때까지 기다려야만 하는 상황. 이는 이벤트 루프가 블로킹 작업을 하는 동안 JS의 실행을 할 수 없기 때문에 발생한다.
블로킹은 libuv를 사용하는 Node.js 표준 라이브러리의 동기 메서드가 대표적 블로킹 작업이다. 네이티브 모듈도 블로킹 메서드를 가질 수 있다. (I/O와 같은 JS가 작업을 기다리는 것이 아닌 CPU 집약적 작업 때문에 나쁜 성능을 보여주는 JS는 보통 블로킹이라고 부르지 않는다.)
Node.js 표준 라이브러리의 모든 I/O 메서드는 논블로킹인 비동기 방식을 제공하고 콜백함수를 받는다. 일부 메서드는 같은 작업을 하는 블로킹 메서드도 가지는데 이름 끝에 Sync가 붙는다.(ex. fs.readFileSync())
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocking
console.log(data);
morework(); // console.log 이후 실행될 것이다.
const fs = require('fs');
fs.readFile('file.md', (err, data) => {
if(err) throw err;
console.log(data);
})
morework(); // console.log 이전에 실행될 것이다.
const fs = require('fs');
fs.readFile('file.md', (err, data) => {
if(err) throw err;
console.log(data);
})
fs.unlinkSync('file.md');
위 코드는 fs.unlinkSync()
코드가 fs.readFile()
코드보다 먼저 실행될 수 있으므로 실제 file.md를 읽기 전에 파일을 제거할 수 있다. 두 코드 모두 논블로킹으로 호출해 작업 순서를 보장해줘야한다.
const fs = require('fs');
fs.readFile('file.md', (err, data) => {
if(err) throw err;
console.log(data);
fs.unlink('file.md', (unlinkErr) => {
if(unlinkErr) throw unlinkErr;
})
})