Node.js知识点

因为javascript引擎的关系,node.js默认是单线程,一个node.js应用无法利用多核资源。不过有第三方库提供多线程支持,但不是无缝的。node.js是解决I/O瓶颈的(相对于传统技术,同步阻塞调用浪费线程),它并没有提高I/O速度,只是资源调度更高效。如果I/O速度不解决,node.js只能说能同时处理好多request,但每个request的响应时间还是那么长,甚至更长。

Node.js 采用事件驱动和异步 I/O 的方式,实现了一个单线程、高并发的 JavaScript 运行时环境,而单线程就意味着同一时间只能做一件事,那么 Node.js 如何通过单线程来实现高并发和异步 I/O??

高并发策略

    一般来说,高并发的解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步 I/O,系统通过线程切换来弥补同步 I/O 调用的时间开销。比如 Apache 就是这种策略,由于 I/O 一般都是耗时操作,因此这种策略很难实现高性能,但非常简单,可以实现复杂的交互逻辑。

而事实上,大多数网站的服务器端都不会做太多的计算,它们接收到请求以后,把请求交给其它服务来处理(比如读取数据库),然后等着结果返回,最后再把结果发给客户端。因此,Node.js 针对这一事实采用了单线程模型来处理,它不会为每个接入请求分配一个线程,而是用一个主线程处理所有的请求,然后对 I/O 操作进行异步处理,避开了创建、销毁线程以及在线程间切换所需的开销和复杂性。

事件循环

Node.js 在主线程里维护了一个事件队列,当接到请求后,就将该请求作为一个事件放入这个队列中,然后继续接收其他请求。当主线程空闲时(没有请求接入时),就开始循环事件队列,检查队列中是否有要处理的事件,这时要分两种情况:如果是非 I/O 任务,就亲自处理,并通过回调函数返回到上层调用;如果是 I/O 任务,就从 线程池 中拿出一个线程来处理这个事件,并指定回调函数,然后继续循环队列中的其他事件。

当线程中的 I/O 任务完成以后,就执行指定的回调函数,并把这个完成的事件放到事件队列的尾部,等待事件循环,当主线程再次循环到该事件时,就直接处理并返回给上层调用。 这个过程就叫 事件循环 (Event Loop),其运行原理如下图所示:

消息队列和事件循环

异步过程中,工作线程在异步操作完成后需要通知主线程。那么这个通知机制是怎样实现的呢?答案是利用消息队列和事件循环。工作线程将消息放到消息队列,主线程通过事件循环过程去取消息。

消息队列:消息队列是一个先进先出的队列,它里面存放这各种消息。

事件循环:事件循环是指主线程重复从消息队列中取消息,执行的过程。

  实际上,主线程只会做一件事情,就是从消息队列里面取消息、执行消息、再取消息、再执行消息。当消息队列为空时,就会等待直到消息队列变成非空。而且主线程只有在将前面的消息执行完成后,才会去去下一个消息。这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。

事件循环机制呢,简单点来说,就是在执行上下文的过程中,对函数的入栈和出栈。执行前函数先入栈,执行完后函数出栈。如若遇到了一些异步操作像回调函数以及ajax、setTimeout等,会先将他们交给浏览器的其他模块去执行,执行完后,会把回调函数放入到taskqueue中。当所有的call stack执行完后再开始执行task queue中的函数

哪个异步操作完成的早,就排在前面。不论异步操作何时开始执行,只要异步操作执行完成,就可以到消息队列中排队

其中setTimeout和Promise的任务队列叫做macro-task(宏任务),当然如我们所想,还有micro-task(微任务)。

macro-task包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。

micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver

参考:

https://zhuanlan.zhihu.com/p/26229293

https://zhuanlan.zhihu.com/p/26238030

原文地址:https://www.cnblogs.com/wuhuaguo/p/9953717.html

时间: 2024-08-30 11:12:18

Node.js知识点的相关文章

Node.js知识点学习

Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期的javascript需求都很简单,基本都是写成函数的,然后是面向过程的写法,后来慢慢的引入面向对象开发思想,再后来就慢慢写成 类.最后node.js的出现才开始有了js模块化开发的概念,这使得臃肿的js代码免去了命名冲突等一系列开发难题. Node最大的特点就是采用了异步式I/O与事件驱动的架构设

Node.js知识点详解(一)基础部分

转自:http://segmentfault.com/a/1190000000728401 模块 Node.js 提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.接下来我们就来创建hello.js文件,代码如下: exports.world = function() { console.log('Hello World'); } 在以上示例中,hello.js 通过 e

Node.js知识点整理之----简介

1.Node.js首要目标是提供一种简单的.用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具. 2.Node.js修改了客户端到服务器端的连接方法,解决了 服务器所支持的最大同时连接用户量瓶颈的问题.因为它并不为每个客户端创建一个新的线程,而是为每个客户端连接触发一个在Node.js内部进行处理的事件.因此,如果使用Node.js,可以同时处理多达几万个用户的客户端连接. 3.在Node.js服务器中,运行的是高性能的V8 JavaScript脚本语言,该语言是一种被V8 Jav

Node.js知识点整理之----REPL

交互式运行环境.在命令窗口中,输入"node"命令并回车,即可进入REPL运行环境. 基础命令: .break 返回到命令提示符的起点处 按下Ctrl+C组合键,可以替代.break命令 两次Ctrl+C退出REPL运行环境 .clear 清除REPL运行环境的上下文对象中保存的所有变量和函数 返回到命令提示符的起点处 .exit 退出REPL运行环境 按下Ctrl+D组合键,可以代替.exit命令 .help 显示REPL运行环境中所有的基础命令 .save 保存 在REPL运行环境

Node.js知识点整理之----基础知识----事件处理机制及事件环机制

在event模块中,定义了EventEmitter类,所有触发事件的对象都是继承了这个类的子类的实例对象. addListener(event,listener) 对指定事件绑定事件处理函数 on(event,listener) 对指定事件绑定事件处理函数(addListener方法的别名) var http = require('http'); var server = http.createServer(); server.on('request',function(req,res){ co

纯干货 | Node.js快速入门指南与实践

前言 Node.js知识点虽然不多,但是想要通篇的看完并快速上手还是需要一些时间的.而这篇文章主要总结工作中Node.js一些常用模块API的用法以及优秀的第三方模块,帮助你快速的上手.Good Luck?????? 惯例 Node.js是基于Chrome V8引擎的Javascript运行环境. console - 控制台 1.控制台打印信息 console.log('日志信息'); console.warn('警告信息'); console.debug('调试信息'); console.er

Node.js的知识点框架整理

背景:因为appium是基于Node.js的,所以想看一下Node.js.但是发现很多资料的顺序看起来有点颠倒.然后就一面看资料一面整理了一下大概的知识点框架,希望对自己对别人有用. 本文不包含node.js的基本语法.node.js的基本语法和JavaScript基本一样,可以以后再单独整理一份基本语法的. Node.js是一个基于chrome V8的JavaScript运行时的环境 Node.js是事件驱动,非阻塞式I/O模型 Node.js使用npm包管理器 使用Node.js不仅实现了一

Node.js前置知识点(一):回调函数

前言 因为开始了解和学习Node.js,发现在使用之前,有必要先知道一些前置的知识点(其实是关于操作系统的知识),主要包括: 什么是 回调函数(callback): 什么是 同步/异步: 什么是 I/O: 什么是 单线程/多线程: 什么是 阻塞/非阻塞: 什么是 事件 和 事件驱动: 什么是 基于事件驱动的 回调: 什么是 事件循环: 本文就是系列文章的第一篇,用来介绍回调函数.(参考来源 见文末的 Reference) 一 什么是 回调函数(callback) 我觉得理解一个概念,应该是从简单

Node.js的基础知识点

一,语言 和 环境(平台) 之间的关系 1,浏览器环境 中的 Javascript 浏览器中 Javascript 的组成部分 ECMAScript核心 + DOM + BOM 2,Node环境 中的 Javascript Node.js 中 Javascript 的组成部分 ECMAScript 核心 + 全局成员 + 核心 API 模块 全局成员:console.setInterval.setTimeout... 核心 API 模块:就是 Node 平台 单独提供的一些API,这些API是N