node之回头看理论(1)

这应该是本系列的第一篇文章。在视频学习了一部分之后,发现很多东西都是知其然而不知所以然,即使能熟练地敲出一个个回调函数,“背代码”的感觉让人越发不安。所以我决定比较深度的探究一些之前忽略掉的node.js

特点

说起node,主要特点是

  • 单线程
  • 非阻塞
  • 事件驱动
    还有一些不容易说出口的有:node是js的一个运行环境(解释器);node依赖于Chrome V8引擎进行代码解释(高效)。
    为了将这些特点更好的解释,就不得不引入另一个概念:异步I/O

异步I/0

在学习node之前,我们的ajax,还有曾经使用多次而不自知的addeventlistener函数,定时器函数等等,都在使用所谓的异步。异步是相对于同步(按照顺序一件一件执行)来讲的概念。单独解释一个概念不免有失偏颇,所以这里先不急着给异步操作下定义,我们继续讲:

很早,异步就存在于操作系统的底层·,但是在绝大多数高级语言中,异步并不常见…
在众多高级编程语言或运行平台中,将异步作为主要编程方式和设计理念的,Node是首个。

(引用于node.js深入浅出)

那么我们使用异步的原因是什么呢?我抱着学习的态度,从两个方面进行介绍:
首先是用户体验。异步首先在前端流行不无道理。作为用户直接接触的部分,卡顿的页面渲染和交互行为是极为糟糕的用户体验。于是采用异步请求,在下载资源期间,用户无论是视觉上的页面效果,还是手动的交互体验都得以继续响应。
说的再好听都不如代码看的真切:

getData1('from A')  //消耗时间M
getData2('from B')  //消耗时间N


//改成异步
getData1('from A',function(result){
//消耗时间M
})
getData2('from B',function(result){
//消耗时间N
})

前者耗时M+N,后者为max(M,N)。后端的快速响应才能使前端的体验变得更好
其次是资源分配
如果有一组互不相干的任务。主流方法有

  • 单线程串行依次执行
  • 多线程并发完成

第一种,更符合编程人员顺序思考的思维方式,逻辑层面会更通顺。但是缺点也很明确,同步操作非常容易造成I/O(文件读写,网络请求)阻塞。一哥们网卡登录不进去其他人都排着吧那当然不行。同时造成资源浪费;
第二种,首先解释一下并发吧
在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
(我这多句嘴,并发和并行是不同的两个概念,所以口误尽量要避免,并行,实在同一时刻执行两个事件,并发则是在同一时间间隔来进行的)
创建线程,在多核CPU的利用率方面一定是有其优势的,但是执行器上下文的切换,还有创建本身就是很大的开销。当然还有无法忽视的线程安全问题,比如各个地方都要考虑lock,还有状态的同步等等问题。
所以node在两者之间给出了更好的答案:

  • 利用单线程:远离死锁,状态同步问题
  • 利用异步I/O:让单线程远离阻塞

对于刚才介绍的node主要的三个主要特点当然还是要自圆其说:
一个被举起来很多次的栗子:我和小白出去吃饭,我俩对着老板同时喊叫,老板不愿意,让我俩排好队,一个一个点。那行吧那我让小白先点,她点完了,老板叫服务员甲去招呼她坐下,端水什么的,然后是我,我点完老板又叫来服务员乙,最后当然各自吃饭,结账。
稍作解析(敲黑板):
老板,就是主线程;
我和小白就是请求,排的队就是事件循环;
俩服务员那就是从线程池子线程。
因为我俩的请求,创建了两个线程,我俩吃饭的过程就是点餐事件伴随的回调函数就是吃。
吃完了结账就是执行完啦,子线程释放回事件池
解析完成
其实不是很难理解。本篇文章虽然只是笼而统之的介绍,但是也不会仅仅停留在表层的类比理解上。
在此先介绍一下事件循环。嗯应该加标题了

事件循环

这是Node自身的执行模型,他使得回调函数普遍使用。本身其内部有一个类似while(1)循环,每执行一次循环都成为tick(process.nextTick函数还记得吗?不记得没事,后续文章会讲解),每个tick的过程都是查看是否还有事件待处理,有的话就取出事件和相关回调函数。在此过程中,不会影响主线程的解析执行。
有点理解了?
后面会继续探讨,后续我会加上链接。欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值