Node.js 이벤트 루프 및 콜백 함수에 대한 심층적인 이해

高洛峰
풀어 주다: 2016-12-08 10:26:53
원래의
1475명이 탐색했습니다.

이 글에서는 Node.js 이벤트 루프와 Node.js 콜백 함수를 자세히 소개합니다. 자세한 내용은 아래를 참조하세요.

1. Node.js 이벤트 루프

Node.js는 단일 프로세스, 단일 스레드 애플리케이션이지만 이벤트와 콜백을 통해 동시성을 지원하므로 성능이 매우 뛰어납니다. 높은. Node.js의 모든 API는 비동기식이며 별도의 스레드로 실행되고 비동기 함수 호출을 사용하며 동시성을 처리합니다. 기본적으로 Node.js의 모든 이벤트 메커니즘은 디자인 패턴의 관찰자 패턴을 사용하여 구현됩니다. Node.js 단일 스레드는 이벤트 관찰자가 종료되지 않을 때까지 while(true) 이벤트 루프를 입력하는 것과 유사합니다. 이벤트가 발생하면 콜백 함수가 호출됩니다. -주도 프로그램


Node.js는 이벤트 중심 모델을 사용합니다. 웹 서버는 요청을 받으면 해당 요청을 닫고 처리한 후 다음 웹 요청을 처리합니다. 요청이 완료되면 처리 대기열로 다시 들어가고, 대기열의 선두에 도달하면 결과가 사용자에게 반환됩니다. 이 모델은 웹 서버가 읽기 또는 쓰기 작업을 기다리지 않고 항상 요청을 수락하기 때문에 매우 효율적이고 확장 가능합니다. (이를 비차단 IO 또는 이벤트 중심 IO라고도 합니다.) 이벤트 기반 모델에서는 이벤트를 수신하고 이벤트가 감지되면 콜백 함수를 트리거하기 위해 메인 루프가 생성됩니다.


전체 이벤트 중심 프로세스가 구현되는 방식은 매우 간단합니다. 옵저버 패턴과 다소 유사하며, 이벤트는 주체(Subject)와 동일하며, 이 이벤트에 등록된 모든 핸들러 함수는 옵저버(Observer)와 동일합니다. Node.js에는 다음 예제와 같이 이벤트 모듈을 도입하고 EventEmitter 클래스를 인스턴스화하여 이벤트를 바인딩하고 수신할 수 있습니다.


// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
以下程序绑定事件处理程序:
// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
我们可以通过程序触发事件:
// 触发事件
eventEmitter.emit('eventName');
로그인 후 복사

2. 예시


main.js 파일을 생성합니다. 코드는 다음과 같습니다.

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
  console.log('连接成功。');
  // 触发 data_received 事件
  eventEmitter.emit('data_received');
}
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
  console.log('数据接收成功。');
});
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
로그인 후 복사

2. Node.js 콜백 함수


Node.js 비동기 프로그래밍의 직접적인 표현은 콜백입니다. 비동기 프로그래밍은 콜백에 의존하지만 콜백을 사용한 후에 프로그램이 비동기화된다고 말할 수는 없습니다. 콜백 함수는 작업 완료 후 호출됩니다. Node는 많은 콜백 함수를 사용합니다. 모든 Node API는 콜백 함수를 지원합니다. 예를 들어, 다른 명령을 실행하는 동안 파일을 읽을 수 있습니다. 파일 읽기가 완료된 후 콜백 함수의 매개변수로 파일 내용을 반환합니다. 이렇게 하면 코드를 실행하는 동안 파일 I/O 작업을 차단하거나 기다리지 않습니다. 이는 Node.js의 성능을 크게 향상시키고 많은 수의 동시 요청을 처리할 수 있습니다.

1. 차단 코드 예시


다음 내용으로 test.txt 파일을 만듭니다.

Hello World!
fs.readFileSync()
fs.readFile()
로그인 후 복사

test.js 파일을 생성합니다. 코드는 다음과 같습니다.

console.log('-------程序开始执行--------'); 
// 引入fs模块
var fs = require("fs");
//同步读取文件
var data = fs.readFileSync('test.txt','utf-8');
console.log(data.toString());
console.log('-------程序执行结束--------');
로그인 후 복사

위 코드의 실행 결과는 다음과 같습니다.


2. 비차단 코드 예시


test.js 파일을 생성합니다. 코드는 다음과 같습니다.

console.log('-------程序开始执行--------'); 
// 引入fs模块
var fs = require("fs");
//异步读取文件
fs.readFile('test.txt','utf-8',function (err, data) {
  if (err) return console.error(err);
  console.log(data.toString());
});
console.log('-------程序执行结束--------');
로그인 후 복사

위 프로그램에서 fs.readFile()은 파일을 읽는 데 비동기 함수를 사용합니다. 파일을 읽는 동안 오류가 발생하면 error err 객체가 오류 메시지를 출력합니다. 오류가 발생하지 않으면 readFile은 err 객체의 출력을 건너뛰고 콜백 함수를 통해 파일 내용을 출력합니다.

위 코드의 실행 결과는 다음과 같습니다.

다음으로 input.txt 파일을 삭제하고 실행 결과는 다음과 같습니다.

위 두 예에서 우리는 차이점을 이해합니다. 차단 및 비차단 통화 사이. 첫 번째 인스턴스는 파일을 읽은 후에만 프로그램을 실행합니다. 두 번째 예에서는 파일을 읽을 때까지 기다릴 필요가 없으므로 파일을 읽는 동시에 다음 코드를 실행할 수 있어 프로그램 성능이 크게 향상됩니다. 따라서 Blocking은 순서대로 실행되지만 Non-Blocking은 순서대로 실행될 필요가 없으므로 콜백 함수의 매개변수 처리가 필요한 경우 콜백 함수에 작성해야 합니다.

3. fs.readFileSync 및 fs.readFile


1. s.readFileSync

구문: fs.readFileSync(파일 이름, [인코딩])

수신 매개변수:

파일 이름: 파일 경로

옵션: 옵션 개체, 인코딩 포함, 인코딩 형식, 이 항목은 선택 사항입니다.

Node.js는 utf8, ucs2, ascii, binary, base64, hex 인코딩만 지원하므로 중국어 GBK나 GB2312 등의 인코딩은 지원하지 않으므로, GBK 또는 GB2312 형식 중국어 콘텐츠의 경우 iconv-lite라는 추가 모듈을 사용해야 합니다.

2. fs.readFile

구문: fs.readFile(filename, [encoding], [callback(err,data)])

수신 매개변수:

파일 이름: 파일 경로

옵션: 옵션 개체, 인코딩, 인코딩 형식을 포함하며 이 항목은 선택 사항입니다.

콜백: 콜백, 2개의 매개변수 전달: 예외 오류 및 파일 콘텐츠 데이터

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!