NodeJs事件驱动和非阻塞机制详解

NodeJs事件驱动和非阻塞机制详解

NodeJs强调错误优先

  • 因为事件的操作大多数都是异步的方式,无法通过try catch捕获异常
  • 采用错误优先的回调函数

NodeJs基本介绍(菜鸟教程)

  1. Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
  2. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
  3. Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
  4. Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。

NodeJs事件驱动机制

Nginx的服务原理类似,Node采用事件驱动的运行方式。不过nginx式多进程单线程,而Node通过事件驱动的方式处理请求时无需为每一个请求创建额外的线程。在事件驱动的模型当中,每一个IO工作被添加到事件队列中,线程循环地处理队列上的工作任务,当执行过程中遇到来堵塞(读取文件、查询数据库)时,线程不会停下来等待结果,而是留下一个处理结果的回调函数,转而继续执行队列中的下一个任务。这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用

前面也说过Node Async IO = CPS + Callback,这一套实现开始于Node开始启动的进程,在这个进程中Node会创建一个循环,每次循环运行就是一个Tick周期,每个Tick周期中会从事件队列查看是否有事件需要处理,如果有就取出事件并执行相关的回调函数。事件队列事件全部执行完毕,node应用就会终止。Node对于堵塞IO的处理在幕后使用线程池来确保工作的执行。Node从池中取得一个线程来执行复杂任务,而不占用主循环线程。这样就防止堵塞IO占用空闲资源。当堵塞任务执行完毕通过添加到事件队列中的回调函数来处理接下来的工作。

mark

自己的描述

  1. Node是一个单线程的语言,采用事件驱动和异步回调的机制。在执行代码的时候,主线程从上往下依次执行,遇到有需要回调的地方,就将此处加入到事件队列中,然后主线程继续往下走,直到运行结束以后,才去执行事件队列中的回调
  2. node去执行事件队列中的事件时,如果遇到回调,依然是按照顺序添加进入事件队列,主线程一次往下执行,遇到回调就添加,直至执行完毕。
  3. node是一个单线程多进程的。node进程创建一个循环,每个循环就是一个周期,在循环中会从事件队列里查看是否有事件需要处理,如果有就去除事件并执行相关的函数。对于阻塞事件的处理在幕后使用线程池来确保工作的运行,而不占用主循环流程。

NodeJs非阻塞机制

(
mark

)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 看到很多文件介绍关于Node.js中的事件循环,但是总是有些地方不是很理解,最近无意中看到了Node官方文档中对事...
    勤劳的小叶阅读 8,574评论 0 5
  • 1 nodejs 中的异步存在吗? 现在有点 javascript 基础的人都在听说过 nodejs ,而只要与 ...
    htoo阅读 11,549评论 4 51
  • Nodejs既然这么流行就肯定有它的博大精深之处,自然不是我这还没入门的小白可以掌握的,我就简单说一下目前自己的理...
    小弋呀阅读 7,253评论 0 2
  • 如果记忆是酒 我本是不愿意说的,但只是写回忆的话也好像并没有什么不适。 我们跨越了半个中国的路程,一起去了台湾,在...
    药尘尘阅读 2,944评论 0 1
  • 这个夏天,我想记录我所熟悉的吉林市的企业家,老夏必然是第一个。 尽管我认识他是在一个遥远的冬天。 那个日子很遥远,...
    吉林市权红阅读 4,922评论 1 2