>  기사  >  웹 프론트엔드  >  Node.js의 차단 및 비차단에 대한 설명

Node.js의 차단 및 비차단에 대한 설명

不言
不言앞으로
2018-11-15 17:30:551862검색

이 글은 Node.js의 차단 및 비차단에 대한 설명을 제공하며, 필요한 참고가 될 수 있습니다.

차단 및 비차단 개요

이 개요는 Node.js의 차단 호출과 비차단 호출의 차이점을 소개합니다. 이 개요에서는 이벤트 루프와 libuv를 참조하지만 이러한 주제에 대한 사전 지식은 필요하지 않습니다. 독자가 JavaScript에 대한 지식과 Node.js 콜백 패턴을 기본적으로 이해하고 있다고 가정합니다.

"I/O"는 주로 libuv가 지원하는 시스템의 디스크 및 네트워크와의 상호 작용을 의미합니다.

Blocking

Blocking은 Node.js 프로세스에서 다른 JavaScript를 실행할 때 JavaScript가 아닌 작업이 완료될 때까지 기다려야 하는 경우입니다. 이는 차단 작업이 발생하는 동안 이벤트 루프가 JavaScript를 계속 실행할 수 없기 때문입니다.

Node.js에서는 I/O와 같은 JavaScript가 아닌 작업을 기다리지 않고 CPU를 많이 사용하여 성능이 저하되는 JavaScript를 일반적으로 차단이라고 부르지 않습니다. Node.js 표준 라이브러리에서 libuv를 이용한 동기화 방법은 가장 일반적으로 사용되는 차단 작업이며, 네이티브 모듈에도 차단 방법이 있을 수 있습니다.

Node.js 표준 라이브러리의 모든 I/O 메서드는 비차단 비동기 버전을 제공하고 콜백 함수를 허용합니다. 일부 메서드에는 이름이 Sync로 끝나는 해당 차단 메서드도 있습니다. Sync结尾。

比较代码

阻塞方法同步执行,非阻塞方法异步执行。

以文件系统模块为例,这是一个同步读取文件的方法:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read

这是一个等效的异步示例:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
});

第一个示例看起来比第二个示例更简单,但缺点是第二行阻止执行任何其他JavaScript,直到读取整个文件,请注意,在同步版本中,如果抛出错误,则需要捕获它,否则进程将崩溃,在异步版本中,由作者决定是否应该如图所示抛出错误。

让我们稍微扩展一下我们的例子:

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

这是一个类似但不等同的异步示例:

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
// moreWork(); will run before console.log

在上面的第一个示例中,将在moreWork()之前调用console.log,在第二个示例中,fs.readFile()是非阻塞的,因此JavaScript执行可以继续,并且将首先调用moreWork(),在不等待文件读取完成的情况下运行moreWork()

비교 코드

블로킹 메서드는 동기식으로 실행되고, 비차단 메서드는 비동기식으로 실행됩니다.

파일 시스템 모듈을 예로 들면 다음과 같습니다. 파일을 동기적으로 읽는 방법은 다음과 같습니다.

const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
  if (err) throw err;
  console.log(data);
});
fs.unlinkSync('/file.md');
동등한 비동기 예제는 다음과 같습니다.

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;
  });
});
첫 번째 예는 두 번째 예보다 간단해 보이지만 두 번째는 단점이 있습니다. 전체 파일을 읽을 때까지 다른 JavaScript의 실행을 차단하는 줄입니다. 동기 버전에서는 오류가 발생하면 오류를 잡아야 하며, 그렇지 않으면 프로세스가 중단됩니다. 비동기 버전에서는 작성자에게 달려 있습니다. 그림에 표시된 오류가 발생합니다.

예제를 조금 확장해 보겠습니다.

rrreee

다음은 비슷하지만 동등하지는 않은 비동기 예입니다.

rrreee

위의 첫 번째 예에서는 moreWork() 호출 console 이전입니다. .log, 두 번째 예에서 fs.readFile()은 비차단이므로 JavaScript 실행을 계속할 수 있고 moreWork(가 먼저 호출됩니다), 파일 읽기가 완료될 때까지 기다리지 않고 moreWork()를 실행할 수 있는 기능은 처리량을 향상시킬 수 있는 핵심 설계 선택입니다.

동시성 및 처리량

Node.js의 JavaScript 실행은 단일 스레드이므로 동시성은 다른 작업을 완료한 후 JavaScript 콜백 함수를 실행하는 이벤트 루프의 기능을 의미하며 동시 방식으로 실행될 것으로 예상되는 모든 코드는 다음을 허용해야 합니다. 비JavaScript 작업(예: I/O)이 발생하기 때문에 이벤트 루프가 계속 실행됩니다. 🎜🎜예를 들어, 각 웹 서버 요청을 완료하는 데 50ms가 걸리고, 50ms 중 45ms가 비동기식으로 수행될 수 있는 데이터베이스 I/O이고, 비차단 비동기 작업을 선택하면 요청당 45ms를 확보하여 다른 요청을 처리할 수 있는 상황을 생각해 보겠습니다. , 차단 방법 대신 비 차단 방법을 사용하기로 선택한 것만으로도 용량이 크게 달라집니다. 🎜🎜이벤트 루프는 동시 작업을 처리하기 위해 추가 스레드를 생성할 수 있는 다른 많은 언어의 모델과 다릅니다. 🎜🎜차단 코드와 비차단 코드 혼합의 위험🎜🎜I/O를 처리할 때 피해야 할 몇 가지 패턴이 있습니다. 예를 살펴보겠습니다. 🎜rrreee🎜위 예에서 fs.unlinkSync()는 가장 가능성이 높습니다. fs.readFile()에서 사용됩니다. 이전에 실행하면 실제로 읽기 전에 file.md가 삭제됩니다. 더 나은 쓰기 방법은 완전히 비차단이며 올바른 순서로 실행되도록 보장하는 것입니다. 🎜rrreee🎜위의 fs.unlink 호출 fs.readFile() ()의 콜백에서 비차단 호출을 수행하여 올바른 작업 순서를 보장합니다. 🎜🎜🎜

위 내용은 Node.js의 차단 및 비차단에 대한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 https://segmentfault.com/a/1190000017016894에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제