面试题答案
一键面试非阻塞I/O操作相较于阻塞I/O操作的主要优势
- 高并发处理能力:阻塞I/O在进行I/O操作(如读取文件、网络请求等)时,会暂停当前线程的执行,直到操作完成。这意味着在I/O操作期间,线程无法处理其他任务,严重限制了系统的并发处理能力。而非阻塞I/O不会阻塞线程,线程可以在I/O操作进行的同时,继续执行其他任务,使得系统能够高效地处理多个并发的I/O请求。
- 资源利用率高:因为非阻塞I/O不会让线程长时间等待I/O操作完成,线程可以在等待I/O的间隙执行其他计算任务,从而提高了CPU等资源的利用率。而阻塞I/O会使线程在I/O等待期间闲置,浪费了CPU资源。
- 更好的响应性:在处理用户请求等场景下,非阻塞I/O能够快速响应新的请求,不会因为某个I/O操作的延迟而影响整个应用的响应速度,提升了用户体验。
在简单网络请求场景下Node.js利用非阻塞I/O提升性能的示例
以下是使用Node.js内置的http
模块发起网络请求的简单示例:
const http = require('http');
const options = {
hostname: 'example.com',
port: 80,
path: '/',
method: 'GET'
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('响应数据:', data);
});
});
req.on('error', (e) => {
console.error('请求错误:', e.message);
});
req.end();
在这个示例中:
http.request
方法发起一个网络请求,它是非阻塞的。这意味着在等待服务器响应的过程中,Node.js的事件循环不会被阻塞,主线程可以继续处理其他任务(例如接收新的网络请求等)。- 通过为
res
对象添加data
和end
事件监听器来处理响应数据。当有数据到来时,data
事件触发,将数据片段拼接起来。当响应结束时,end
事件触发,处理完整的响应数据。这种基于事件驱动的方式与非阻塞I/O紧密配合,有效提升了网络请求场景下的性能,能够高效处理大量并发的网络请求。