乐趣区

关于node.js:nodejs异步IO

nodejs 异步 IO

1.IO 理解

IO 分类 (是否立刻获取到调用之后的后果):
阻塞 IO:

反复调用 IO 操作,判断 IO 是否完结(工作轮询:read、select、poll、kqueue、event ports)因为在轮询的过程中,程序再期待 IO 的后果,对于代码而言,还是同步的成果

非阻塞 IO:

实现无需判断的非阻塞 IO,通过某种信号或者回调的模式传回给以后的代码进行应用
文件 IO:放入到 node 实现的线程池中
异步网络 IO:利用到了 node 的外围库 libuv 库,可判断所运行的平台,依据平台调用不同的异步 IO 解决的办法(做到了相似于跨平台的成果)

实现异步 IO 的过程:

2. 为什么要应用异步 I /O

在不同模式下执行两工作,显然,异步应用的工夫,比同步应用的工夫少

3. 事件驱动架构

事件轮询是异步 IO 的实现,对异步 IO 后果的解决(利用事件驱动、公布订阅、察看则模式),依赖于 nodejs 的 events 库;
代码层面展现:

const EventEmitter = require('events');
const emitter = new EventEmitter();

// 订阅 1
emitter.on('event',(result)=>{console.log('event1 fired');
    console.log(result);
})

// 订阅 2
emitter.on('event',(result)=>{console.log('event2 fired');
})

// 公布
emitter.emit('event','event_result');

/* 后果
event1 fired
event_result
event2 fired
*/

了解到平时编码中,所写的异步代码(订阅啊事件),回调函数就是事件的处理程序,不过公布事件是由零碎实现的

4.nodejs 单线程

怎么实现并发:异步非阻塞 IO 配合事件事件回调告诉
运行 js 代码的主线程是单线程(缩小了多线程切换的 cpu 开销与内存开销),然而在 libuv 库中,应用到了 node 实现的线程池
毛病:解决 cpu 密集型的工作时,无奈体现多核 cpu 的劣势
代码展现单线程解决 cpu 密集型工作时呈现的阻塞景象:

const http = require('http');

function sleepTime(time){const sleep = Date.now() + time * 1000;
    // 同步代码,等待时间
    while(Date.now() < sleep){};
    return;
}

sleepTime(4);
const server = http.createServer((req,res)=>{res.end('server starting ...');
});

server.listen('8080',()=>{console.log('服务启动了');
})

5.nodejs 利用场景

适宜 IO 密集型工作解决,nodejs 作为中间层,搭建 bff 层服务器(进步吞吐量,不便解决数据):

退出移动版