事件循环

简介: 【10月更文挑战第28天】

Node.js的事件循环是其非阻塞I/O和异步编程的核心机制。它使得Node.js能够在单线程上处理大量并发操作,而不需要多线程编程。以下是对Node.js事件循环和事件驱动模型的进一步解释,以及如何使用它们。

事件循环和事件驱动模型

在Node.js中,事件循环不断地检查事件队列,并处理事件,如客户端请求、文件读写完成、数据库查询结果等。当一个事件被处理时,相应的回调函数会被执行。

Node.js的事件驱动模型类似于观察者模式,其中事件是主题,注册到事件上的回调函数是观察者。当事件被触发时,所有注册的回调函数都会被执行。

使用EventEmitter

EventEmitter是Node.js中用于事件驱动编程的核心类。以下是如何使用EventEmitter的示例:

// 引入 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("程序执行完毕。");

当你运行这段代码时,你会看到以下输出:

连接成功。
数据接收成功。
程序执行完毕。

这表明connection事件被触发,执行了connectHandler函数,该函数又触发了data_received事件。

异步I/O示例

Node.js的异步I/O是事件循环的另一个重要应用。以下是使用fs模块异步读取文件内容的示例:

var fs = require("fs");

// 异步读取文件
fs.readFile('input.txt', function (err, data) {
   
   if (err){
   
      console.log('发生错误:', err);
      return;
   }
   console.log(data.toString());
});

console.log("程序执行完毕");

在这个示例中,fs.readFile是异步执行的。它不会阻塞后续代码的执行。当文件读取操作完成时,回调函数会被添加到事件队列中。事件循环最终会处理这个事件,并执行回调函数,打印文件内容。

输出结果将是:

程序执行完毕
菜鸟教程官网地址:www.runoob.com

注意,"程序执行完毕"会先于文件内容打印,因为文件读取是异步的。

目录
相关文章
|
6月前
|
存储 Java API
ntyco协程的理解
ntyco协程的理解
81 0
|
3月前
|
存储 Linux 调度
协程(coroutine)的原理和使用
协程(coroutine)的原理和使用
|
10天前
|
存储 JavaScript 前端开发
事件循环的原理是什么
事件循环是一种编程机制,用于在单线程环境中处理多个任务。它通过维护一个任务队列,按顺序执行每个任务,并在任务之间切换,从而实现并发处理。在每个循环中,事件循环检查是否有新的任务加入队列,并执行就绪的任务。
|
2月前
|
存储 JavaScript 前端开发
JavaScript:事件循环机制(EventLoop)
【9月更文挑战第6天】JavaScript:事件循环机制(EventLoop)
32 5
|
3月前
|
存储 前端开发 JavaScript
事件循环机制是什么
【8月更文挑战第3天】事件循环机制是什么
37 1
|
5月前
|
调度 C++ 开发者
C++一分钟之-认识协程(coroutine)
【6月更文挑战第30天】C++20引入的协程提供了一种轻量级的控制流抽象,便于异步编程,减少了对回调和状态机的依赖。协程包括使用`co_await`、`co_return`、`co_yield`的函数,以及协程柄和awaiter来控制执行。它们适合异步IO、生成器和轻量级任务调度。常见问题包括与线程混淆、不当使用`co_await`和资源泄漏。例如,斐波那契生成器协程展示了如何生成序列。正确理解和使用协程能简化异步代码,但需注意生命周期管理。
90 4
|
6月前
|
前端开发 编译器 Linux
浅谈C++20 协程那点事儿
本文是 C++20 的协程入门文章,作者围绕协程的概念到协程的实现思路全方位进行讲解,努力让本文成为全网最好理解的「C++20 协程」原理解析文章。
|
数据采集 缓存 调度
协程小练习
协程小练习
|
6月前
|
前端开发 JavaScript UED