当前位置: 首页 > 工具软件 > 异步式 I/O > 使用案例 >

异步式I/O与事件驱动--起步

谢豪
2023-12-01

Node.js使用的是单线程模型,对于所有I/O都采用异步式的请求方式,避免了频繁的上下文切换。Node.js在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个事件到来,每个异步式I/O请求完成后会被推送到事件队列,等待程序进程进行处理。

例:一个简单的数据库查询操作,按照传统方式实现的代码:

res = db.query('SELECT * from some_table');
res.output();

以上代码在执行到第一行的时候,线程会阻塞,等待数据库返回结果,然后再继续处理。

而在Node.js中,解决方法如下:

db.query('SELECT * from some_table', function(res) {
    res.output();
});

db.query的第二个参数是一个函数,我们成为回调函数。进程在执行到db.query的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环以后,才会调用之前的回调函数继续执行后面的逻辑。

Node.js的异步机制是基于事件的,所有的磁盘I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。Node.js进程在同一时间只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。这样做的好处是,CPU和内存在同一时间集中处理一件事,同时尽可能让耗时的I/O操作并行执行。对于低速连接攻击,Node.js只是在事件队列中增加请求,等待操作系统的回应,因而不会有任何多线程开销,很大程度上可以提高Web应用的健壮性,防止恶意攻击。


参考自《Node.js开发指南》

 类似资料: