node基础(一)

1.node是什么?

  • node.js是一个基于Chrome V8引擎的JavaScript运行环境
  • 使用事件驱动,非阻塞I/O的模式
  • npm是node.js的包管理器,是全球最大的开源库生态系统

2.进程

  • 进程是操作系统分配资源和调度任务的基本单位。
  • 一个进程可以包括多个线程

3.node的特点

node.js服务器:单线程 非阻塞I/O

  • 单线程的优点:
    1)节约内存
    2)节约上下文切换的时间
    3)锁的问题,并发资源的处理

  • 单线程的缺点:在node.js中如果一个线程崩了,那么整个服务器就宕了。

  • 多线程:并不是真正的在同一个时间点执行多个任务,而是通过非常快速的切换时间片来实现

4.浏览器的事件执行机制

浏览器事件循环
  • 对象放在heap中,变量和同步执行任务放在stack中,WebAPIs当执行时间到达(返回数据的时候)放在队列中。
  • 执行顺序:
    1)所有同步任务都在主线程上执行,形成一个执行栈。
    2)主线程之外,还存在一个任务队列。只要异步任务有了运行结果,就在任务队列之中放置一个事件。
    3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,将队列中的事件放到执行栈中依次执行。
    4)主线程从任务队列中读取事件,这个过程是循环不断的。
    简单来说:就是主线程先执行同步代码,当执行完成后,再去读取任务队列。
console.log(1);
setTimeout(function(){
    console.log(2);
    setTimeout(function(){
        console.log(3);
    },1000)
},1000)
setTimeout(function(){
    console.log(4);
},1000)
console.log(5);
输出:1 5 2 4 3
setTimeout为WebAPIs,是异步的,先执行同步代码,按照顺序输出1,5。
当异步时间到了console.log(2);console.log(4)时间一样,按照顺序添加到队列中,当执行第一个setTimeout(    console.log(2);)时,又遇到setTimeout( console.log(3);)将它添加到console.log(4)后面,所以最后输出1 5 2 4 3
console.log(1);
setTimeout(function(){
    console.log(2);
    setTimeout(function(){
        console.log(3);
    },1000)
},2000)
setTimeout(function(){
    console.log(4);
},1000)
console.log(5);
输出:1 5  4  2 3
注意:添加到队列的时间是按照异步谁先返回结果来来决定顺序的

5.node事件执行机制

同步异步取决于被调用者,阻塞非阻塞取决于调用者

同步与异步:关注的是消息通知机制
  • 同步:发出调用后,没有得到结果之前,该调用不返回,一旦调用返回,就得到返回值了。 简而言之就是调用者主动等待这个调用的结果。
  • 异步:调用者在发出调用后这个调用就直接返回了,所以没有返回结果。换句话说当一个异步过程调用发出后,调用者不会立刻得到结果,而是调用发出后,被调用者通过状态、通知或回调函数处理这个调用。
阻塞与非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态.
  • 阻塞调用:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。。
  • 非阻塞调用:在不能立刻得到结果之前,该调用不会阻塞当前线程。
node的运行机制
node的运行流程
  • 我们写的js代码会交给v8引擎进行处理
  • 代码中可能会调用nodeApi,node会交给libuv库处理
  • libuv通过阻塞i/o和多线程实现了异步io
  • 通过事件驱动的方式,将结果放到事件队列中,最终交给我们的应用
node的event loop
node的event loop
  • 在libuv内部有这样一个事件环机制。在node启动时会初始化事件环
  • 每一个阶段都对应一个事件队列,当event loop执行到某个阶段时会将当前阶段对应的队列依次执行。当队列执行完毕或者执行的数量超过上线时,会转入下一个阶段。
poll阶段
image
  • 在node中,微任务大概有 then nextTick,宏任务有 setTimeout setInterval setImmediate
  • node中的执行顺序:先执行当前栈,再执行完微任务,然后检查timers,如图所示有timer的时候先执行完所有的timer,完成之后再去检查有没有微任务,有的话就执行微任务,没有的话就走下一阶断(I/O callbacks处理网络、流的错误),执行完这一阶段,再去查看有没有微任务,依次循环。
注意:node的执行顺序与浏览器并不一样
console.log(1);
setTimeout(function(){
    console.log(2)
    Promise.resolve().then(function(){
        console.log(3)
    });
})
setTimeout(function(){
    console.log(4);
});
在浏览器运行结果:1 2 3 4
浏览器执行顺序是这样的,先执行同步任务,然后检查微任务,如果有先执行微任务,如果没有那就拿出队列的一个任务放到执行栈去执行,之后再去检查微任务,当发现有微任务的时候,先执行微任务,之后再去执行队列的事件,依次循环。
在node运行结果:1 2 4 3
node执行的顺序:先执行同步任务,然后检查微任务,如果有先执行微任务,之后执行完所有的timers这个阶段,再去检查有没有微任务,有就执行微任务,没有就走下一阶断(I/O callbacks处理网络、流的错误),执行完,再看是否有微任务,这样依次循环
宏任务和微任务:

常见的宏任务:setTimeout, setInterval, setImmediate, I/O
常见的微任务:process.nextTick, 原生Promise(有些promise将then方法放到了宏任务中),Object.observe(已废弃), MutationObserver

setTimeout&setImmediate
  • setImmediate 在poll阶段完成时执行,即check阶段;
  • setTimeout 在poll阶段为空闲时,且设定时间到达后执行;但其在timer阶段执行 其二者的调用顺序取决于当前event loop的上下文,如果他们在异步i/o callback之外调用(在i/o内调用因为下一阶段为check阶段),其执行先后顺序是不确定的,需要看loop的执行前的耗时情况。
let fs = require('fs');
fs.readFile('./1.log',function(){
    console.log(1);
    setTimeout(function(){
        console.log(2);
    })
    setImmediate(function(){
        console.log(3)
    })
})
输出:1 3 2
i/o操作阶段完成后 会走check阶段,所以setImmediate会优先于timeout
nextTick

在执行栈的尾部、任务队列之前触发回调函数。简单来说它指定的任务总是发生在所有异步任务之前

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容