[Node.js] blocking non-blocking

변진상·2023년 9월 5일
0

학습 기록

목록 보기
29/31

이 글은 Node.js의 공식문서를 참고하여 작성한 글입니다.
(출처:https://nodejs.org/ko/docs/guides/blocking-vs-non-blocking)

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;
    })
})
profile
자신을 개발하는 개발자!

0개의 댓글