blocking, non-blocking in node.js
blocking은 Node.js 프로세서에서 추가 Javascript 실행이 Javascript가 아닌 작업(파일 불러오기 등)이 완료될 때까지 기다려야하는 경우이다. 이는 Blocking 작업이 발생하는 동안 이벤트 루프가 JavaScript를 계속 실행할 수 없기 때문에 발생한다.
Blocking Function
JSON.stringfy 함수와 window.alert는 Blocking함수이다. 해당 작업을 마쳐야 다음 작업을 수행할 수 있다.
Node.js에 있는 Blocking 메서드
const fs = require('fs');
const data = fs.readFileSync('file.md'); // blocks here until file is read
console.log(data);
moreWork(); // will run after console.log
Node.js 표준 라이브러리의 모든 I/O 메서드는 non-blocking 및 callback 함수를 허용하는 비동기 버전을 제공한다. 일부 메서드에서는 이름이 Sync로 끝나는 Block Method도 있다.
Non-Blocking Method 사용
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
moreWork(); // will run before console.log
첫 번째 예는 두 번째 예보다 간단해 보이지만 두 번째 줄이 전체 파일을 읽을 때까지 추가 JavaScript실행을 차단하는 단점이 있다. 동기식 버전에서는 오류가 발생하면 이를 잡아야 하며 그렇지 않으면 프로세스가 중단된다. 비동기 버전에서 표시된대로 오류를 발생시켜야 하는지 여부는 작성자가 결정한다.
Blocking 코드와 Non-Blocking 코드를 함께 쓸 때 발생할 수 있는 문제
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
if (err) throw err;
console.log(data);
});
fs.unlinkSync('/file.md'); // 파일 삭제 메서드
위의 예에서 file.md를 삭제하는 fs.unlinkSync()이 파일을 읽는 fs.readFile보다 먼저 실행될 가능성이 높다.
const fs = require('fs');
fs.readFile('/file.md', (readFileErr, data) => {
if (readFileErr) throw readFileErr;
console.log(data);
fs.unlink('/file.md', (unlinkErr) => {
if (unlinkErr) throw unlinkErr;
});
});
위의 내용은 올바른 작업 순서를 보장하는 fs.readFile()의 콜백 내에서 fs.unlink()에 대한 non-blocking 호출을 배치한다.
'NODE.JS' 카테고리의 다른 글
[Node.js] node.js가 비동기를 처리하는 방법 (0) | 2024.01.12 |
---|---|
[Node.js] package.json 이름 규칙 (String does not match the pattern of "^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$".) (1) | 2024.01.07 |
[Node.js] Node.js가 작업을 처리하는 방법 (0) | 2024.01.05 |
[Node.js] Node.js API와 브라우저 API의 차이 (1) | 2024.01.05 |
[Node.js] Node.js란? (1) | 2024.01.05 |