-
Nodejs Blocking/Non-Blocking,개발 2023. 1. 26. 17:33
노드제이에스에서 Blocking은 자바스크립트의 실행을 위해 자바스크립트 작업이 아닌(non-JavaScript operation)의 작업이 끝날 때 까지 기다려야 하는 것을 말한다. 주로 I/O 작업의 실행을 위해 기다릴 때 Blocking 이 생긴다. libuv를 사용하는 노드 제이에스 동기 메서드가 대표적인 블로킹 작업이다.
표준 라이브러리의 I/O에서는 대체로 Blocking 메서드와 Non-Blocking 메서드를 모두 제공한다.
const fs = require('fs'); const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹됩니다. console.log(data); moreWork(); // console.log 이후 실행될 것입니다.
fs.readFileSync는 Blocking 작업이기 때문에 모두 끝날 때까지 다음 작업이 시작하지 않는다
const fs = require('fs'); fs.readFile('/file.md', (err, data) => { if (err) throw err; console.log(data); }); moreWork(); // console.log 이전에 실행될 것입니다.
fs.readFile은 Non-Blocking 작업이기 때문에 끝나기 전에 다음 작업이 시작된다.
자바스크립트는 싱글쓰레드이기 때문에 동시성은 이벤트 루프가 다른 작업을 완료하면서 자바스크립트 콜백을 처리할 수 있느냐 없느냐에 달려 있다. 동시에 실행되길 원하는 코드는 이벤트 루프가 I/O 같은 비 자바스크립트 함수가 실행될 수 있도록 제공해야한다.
50ms 의 요청 처리 작업중 45ms가 데이터베이스 i/o 가 사용한다고 한다면, non blocking 비동기 작업을 사용하면 45ms의 시간을 다른 요청을 처리하는데 사용할 수 있다. non blocking 방식을 사용하는 것만으로도 이벤트 루프의 자원을 효율적으로 사용할 수 있게 된다.
'개발' 카테고리의 다른 글
Python - 제너레이터 (0) 2023.02.14 Python - 데코레이터 (0) 2023.02.14 socketio redis adapter (0) 2023.01.06 dart - mixin (0) 2023.01.04 flutter - provider 패턴 (0) 2023.01.04