목 차![down-arrow]()
〈
Node.js Blocking, Non-blocking
2024.03.11.

Blocking & Non-blocking
1. Node.js에서 Blocking과 Non-blocking
1-1. Blocking
Blocking은 Node.js 프로세스에서"추가 JS작업"이"JS가 아닌 작업"이 완료될 때까지기다려야하는 경우를 의미함
- Blocking Function
JSON.stringify(),window.alert(),fs.readFileSync()등…- 해당 작업을 마쳐야 다음 작업을 수행할 수 있음
// Blocking 예시
const fs = require('fs');
const data = fs.readFileSync('/file.md'); // 이 부분이 blocking 발생시킴
console.log(data);
console.log("hello"); // blocking 부분이 완료된 후, 실행됨1-2. Non-blocking
- Node.js 표준 라이브러리의
모든 I/O 메서드는 non-blocking 및 callback 함수를 허용하는비동기 버전을 제공함
- Non-blocking Method
fs.readFile()등…- 해당 작업을
비동기적으로 수행하게 됨
// Non-blocking 예시
const fs = require('fs');
fs.readFile('/file.md', (err, data) => { // 비동기적으로 수행
if (error) throw err;
console.log(data);
});
console.log("hello"); // readFile이 완료되지 않아도 실행됨1-3. Blocking 코드와 Non-blocking 코드 함께 사용 시, 발생할 수 있는 문제
- 문제 상황
// 문제 발생 가능 상황
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
})
fs.unlinkSync('/file.md');- 위 코드의 의도는 아래와 같을 수 있음
1. 파일 읽기 --> 2. 파일 지우기- 하지만 실제로는 아래의 순서로 작업이 수행될 가능성이 높음
2. 파일 지우기 --> 1. 파일 읽기- 해결 방안
- 따라서 올바른 순서를 보장하는
fs.readFile()의콜백 내에서fs.unlink()에 대한 Non-blocking 호출 배치
// 문제 해결 방안
const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {
if (readFileErr) throw readFileErr;
console.log(data);
fs.unlink('/file.md', (unlinkErr) => { // 파일 지우기 작업을 readFile 콜백에서 수행되도록 함
if (unlinkErr) throw unlinkErr;
});
})
