NodeJS는 어떻게“비 차단”될 수 있습니까?


14

NodeJS를 배우고 있으며 무언가를 명확히하고 싶었습니다. 지금까지 여러 입문 튜토리얼과 서적에서 Node의 "비 차단"아키텍처에 대해 설명했거나 오히려 비 차단 방식으로 코딩하는 것이 가능하고 전체 포인트를 권장했습니다.

예를 들어,이 예제는 데이터베이스에서 데이터를 가져 오는 비동기 방식을 읽는 책에서 제공되었습니다.

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

내가 이해하는 것처럼 Node는 데이터베이스를 호출 한 다음 호출 스택에서 다음에있을 수있는 것을 계속 처리합니다. 데이터베이스 요청이 완료되면 익명 콜백 함수의 데이터 변수가 채워지고 해당 함수가 호출 스택에 추가됩니다 (그리고 노드가이를 가져 오면 실행 됨).

내 질문은 데이터베이스 요청을 정확히 처리 하는 것입니까? 확실히 노드가 차단해야합니까? 데이터베이스 요청을 처리하는 것은 무엇입니까? 또는 Node가 외부 리소스에 대한 비동기 HTTP GET 요청을 기다리는 경우 Node가 호출 스택을 계속 처리하고 "비 차단"할 수 있도록하는 요청을 처리하는 것은 무엇입니까?

답변:


17

Node.js가 "비 차단"으로 설명 될 때, 특히 IO가 비 차단임을 의미합니다. 노드는 libuv를 사용 합니다 를 하여 플랫폼에 구애받지 않는 방식으로 IO를 처리합니다. Windows에서는 IO 완료 포트를 사용하고 Unix에서는 epoll / kqueue / select / etc를 사용합니다. 따라서 비 차단 IO 요청 (백그라운드 스레드 모니터링이있을 수 있지만 JavaScript에 노출되지 않음)을 만들고 결과적으로 이벤트 루프 내에서 메인에서 JavaScript 콜백을 호출하는 이벤트 루프 내에서 대기합니다 (읽기 : JavaScript 스레드 만 해당합니다.

데이터베이스의 경우 라이브러리 작성 방법에 따라 다릅니다. HTTP를 사용하여 통신하는 경우 (일부 NoSQL 데이터베이스와 마찬가지로) 표준 노드 http라이브러리를 사용하여 순수 JavaScript로 쉽게 작성할 수 있습니다 . 그것이 다른 방법으로 수행한다면, 그것은 도서관에 달려 있습니다. 추상화가 JavaScript에 노출되지 않는 한 C / C ++로 작성되고 백그라운드 스레드를 사용할 수 있습니다.

데이터베이스 요청 "처리"에 대한 질문에 대해서는 라이브러리에 간단한 메시지 (예 : SQL 문 또는 다른 쿼리 또는 연결 요청)를 보내는 것이 이상적입니다. 계속 gg 거립니다 라이브러리가 메시지를 다시 보낼 준비가되면 콜백을 실행하는 노드의 이벤트 큐로 메시지를 다시 보내 코드 스 니펫을 실행할 수 있습니다.


netHTTP를 사용할 수없는 경우 패키지.
Florian Margaine 2016 년

도움이 될만한 세부 사항. 노드는 V8 JS 엔진을 활용합니다. V8의 가장 좋은 기능 중 하나는 C / C ++ 프로세스를 JS 호출에 쉽게 바인딩하는 것입니다. JavaScript 함수는 차단하고 있지만 모든 함수는 차단하지 않는 기능을 호출합니다. 그런 다음 해당 프로세스가 완료되면 다른 JS 함수가 응답합니다. JS 함수가 서로를 차단한다는 것은 멀티 스레드를 관리해야한다고 가정하는 동일한 파일 위치에 동시에 쓰기를 예약하는 것과 같은 두 가지 작업을 수행하지 않을 것을 의미합니다. 대기열을 만들기 위해 어떤 요청이 먼저 이루어 졌는지는 항상 분명합니다.
Erik Reppen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.