Node中的异步I/O

Node使用了单线程+异步I/O的方式

单线程:解决了 多线程死锁,状态同步
异步I/O:让单线程 远离I/O操作,更好使用CPU

那么异步的I/O由谁来做?

Node提供了类似前端浏览器中Web Workers的子进程。

对于一般的非异步回调函数,函数是由我们自行调用:

var forEach = function(list, callback) {
    for(var i=0; i<list.length; i++) {
        callback(list[i], i, list);
    }
}

对于node中的异步I/O调用来说,回调函数并不是由开发者来调用。

比如当我们使用fs.open方法时,它其实是向下调用了封装好的底层接口,就好比我们的node代码发出了一个命令给底层的I/O线程池,然后就继续做自己的事。当底层代码执行好要返回时,就相当于告诉事件循环:我执行好了,给你结果,你自己拿着处理吧。对于事件循环来说,就相当于又一个事件,然后事件循环就把它给出并自动执行了相关回调。

非I/O的异步API –> setTimeous(), setInterval():

当我们调用了定时器时就会把定时器插入到定时器观察者内部,每次事件循环执行时就从定时器观察者取出这个定时器对象,检查是否超过时间,如果超过就向事件循环发送一个事件,相应的回调函数执行。
因此就出现了问题:当一个定时器设定了10ms时触发,但是9ms后有一个任务占用了CPU5ms,则延迟了4ms

非I/O的异步API –> process.nextTick():

每次调用process.nextTick()方法就会在下一个tick(事件循环)中取出调用,且复杂度小于setTimeout(cb, 0);


基于《深入浅出Node.js》第三章

你可能感兴趣的:(node)