前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NodeJs事件驱动和非阻塞机制详解

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

作者头像
念念不忘
发布2019-03-29 16:46:04
2.6K0
发布2019-03-29 16:46:04
举报
文章被收录于专栏:那些年我们学过的前端

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

)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NodeJs事件驱动和非阻塞机制详解
    • NodeJs强调错误优先
      • NodeJs基本介绍(菜鸟教程)
        • NodeJs事件驱动机制
          • 自己的描述
            • NodeJs非阻塞机制
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档