ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 방식을 사용하는 것만으로도 이벤트 루프의 자원을 효율적으로 사용할 수 있게 된다.

     

     

     

    Overview of Blocking vs Non-Blocking | Node.js

    Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

    nodejs.org

     

    '개발' 카테고리의 다른 글

    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

    댓글

Designed by Tistory.