网易首页 > 网易号 > 正文 申请入驻

web前端开发nodejs基本原理_前端培训

0
分享至

  一. nodejs背景

  先来说说nodejs最常被提到的几个关键词,“单线程”,“非阻塞异步IO”,“事件循环”。接下来主要来通过这几个关键字总结一下nodejs的内在原理,以及引申出的一些问题。

  二. nodejs是单线程吗?

  如果说nodejs是单线程语言,可以想象一下,一个单实例的nodejs的服务器同时接受100个用户请求时,第100个用户的请求要等前面99的用户【关注尚硅谷,轻松学IT】处理完成才能得到处理,如果每个用户的请求要0.3秒,第100个用户需要30秒的等待,这显然和我们的实际情况并不符合,所以说,nodejs并不是单纯的单线程。

  那为什么说nodejs是单线程语言呢?而是因为nodejs中javascript代码的执行是单线程,怎么理解这句话,看下面代码。

  console.log('javascript start');

  setTimeout(()=>{

  console.log('javascript setTimeout');

  }, 2000);

  const now = Date.now();

  while(Date.now() < now + 4000) {}

  console.log('javascript end');

  执行结果:

  $ node index.js

  javascript start

  javascript end

  javascript setTimeout

  上面的代码中,setTimeout的回调代码在while执行4秒期间,计时器已经是过了两秒的,而'javascript setTimeout'这一句打印却在'javascript end'之后,即使计时器在两秒后回调代码应该被执行时,因为javascript的线程处于非空闲状态,而不能输出'javascript setTimeout',javascript代码是单线程这样理解。

  三. nodejs的异步IO

  再拿上面的例子来看,当100个用户请求同时被接受到时,当需要IO(网络IO/文件IO)操作时,单线程的javascript并不会停下来等待IO操作完成,而是“事件驱动”开始介入,javascript执行线程继续执行未完的javascript代码,当执行完成后该线程处于空闲状态,可以看下面这一段代码示例。

  // http.js

  const http = require('http');

  const fs = require('fs');

  let num = 0;

  http.createServer((req, res) => {

  console.log('request id: %d, time:', num++, Date.now());

  fs.readFile('./test.txt', ()=> {

  res.end('response');

  }).listen(9007, ()=>{

  console.log('server start, 127.0.0.1:9007');

  // req.js

  const http = require('http');

  for(let i=0; i<100; i++) {

  http.get('http://127.0.0.1:9007', (res)=>{

  res.on("data",(data)=>{

  console.log('response time:', Date.now())

  // console.log('data', data.toString())

  }).on('error', (err)=>{

  console.log('error', err);

  node http.js // 启动服务器

  node req.js // 发起100个请求

  可以看出100个请求均是在请求返回之前非常短的时间都被得到了处理,而返回则均在请求之后,并非请求按接收顺序依次等待各个IO得到处理后依次返回。

  四. 事件循环

  说到事件循环,在上面的请求中,100个请求的都在非常短的时间得到了处理,而后请求又各自得到了回复,可以思考一下,javascript已经执行到了第100个请求,而第1个请求才得到回复,而第一个请求的栈信息没有丢失,说明第一个请求的请求栈信息被记录了,这一过程便是注册IO事件。

  从上面注册事件后,事件循环得到激活,对于上面代码中fs.readFile这个读文件IO则开始真正执行,而这时候IO的执行跟javascript代码的执行便没有关系了,【关注尚硅谷,轻松学IT】由nodejs底层libuv提供的线程池接收该文件IO执行工作,该线程池默认大小为4,可以通过环境变量process.env.UV_THREADPOOL_SIZE在启动的时候进行调整,但是最大不能超过1024个,有兴趣的可以查看线程池源码;由上可以看出nodejs内部实际是多进程并行工作的,而是利用事件循环做了封口处理。

  再来说说事件循环,上面示例中fs.readFile读文件时,如何知道这个读操作完成了呢?可以思考一下,读操作是线程池来控制执行的,在该线程执行前,先在注册事件的内存中初始化一个状态是“执行中”,并且事件循环也已经被激活,开始轮询等待执行结果,当执行IO的线程在执行完之后,再通过底层的异步IO接口(epoll_wait/IOCP)进行通知到初始注册的任务队列内存进行变更状态,事件循环轮询到状态变成“已完成”,这时候在IO事件注册时注入的回调函数得到执行权,javascript线程开始工作,整个异步过程完毕。

  可以看看事件循环里面都要经过哪些步骤,如何称为事件循环。

  可以看一下英文原版的解释,事件循环解释

  翻译过来:

  **阶段概览**

  timers:这个阶段执行setTimeout() 和 setInterval()中到期的回调函数

  I/O callbacks:执行所有除了setTimeout() ,setInterval(),close事件,setImmediate的其他回调函数

  idle, prepare:仅内部使用

  poll:获取新的I/O 事件,在适当的条件下nodejs会阻塞在这个阶段

  check:setImmediate的回调函数在这里被调用

  close callbacks:像socket.on("close",func)这一类执行close事件的回调

  如上内容难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人。如果对你有帮助不要忘了分享给你的朋友哦!也可以关注作者,查看历史文章并且关注最新动态,助你早日成为一名全栈工程师!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
欠中国的钱,委内瑞拉不还了?美财长:中国已无法继续获得委石油

欠中国的钱,委内瑞拉不还了?美财长:中国已无法继续获得委石油

萌城少年强
2026-01-22 12:47:40
一位马来西亚人称:如果中国真的开战,我要向中国报名加入战争!

一位马来西亚人称:如果中国真的开战,我要向中国报名加入战争!

南权先生
2026-02-11 15:56:36
2小时速破!松江警方抓获两名拉车门盗窃嫌疑人

2小时速破!松江警方抓获两名拉车门盗窃嫌疑人

上观新闻
2026-03-27 15:36:04
赖清德怎么都没想到:柯文哲遭殃,蔡正元入监,让郑丽文更有利了

赖清德怎么都没想到:柯文哲遭殃,蔡正元入监,让郑丽文更有利了

爱意随风起呀
2026-03-27 13:24:17
语出惊人!摩根大通CEO戴蒙称,伊朗战争长期来看是好事!为什么这样说?

语出惊人!摩根大通CEO戴蒙称,伊朗战争长期来看是好事!为什么这样说?

王爷说图表
2026-03-25 18:51:12
惊呆了!原来被我嫌弃3年的微波炉,才是厨房里的“隐形王者”

惊呆了!原来被我嫌弃3年的微波炉,才是厨房里的“隐形王者”

家居设计师宅哥
2026-03-26 23:17:31
医生再三告知:老人同房时,需要注意6件事,不然可能麻烦就大了

医生再三告知:老人同房时,需要注意6件事,不然可能麻烦就大了

路医生健康科普
2026-03-21 15:43:25
中央决定,文宏武履新职

中央决定,文宏武履新职

新京报政事儿
2026-03-27 19:49:13
深圳前市长8年卷走20亿,花天酒地包养女星,落马时只剩三千块

深圳前市长8年卷走20亿,花天酒地包养女星,落马时只剩三千块

文史旺旺旺
2024-12-24 20:42:21
湖北最低5℃!暴雨、雷暴大风即将抵达

湖北最低5℃!暴雨、雷暴大风即将抵达

鲁中晨报
2026-03-27 08:49:03
伊朗发动“真实承诺-4”行动第84波攻势

伊朗发动“真实承诺-4”行动第84波攻势

新华社
2026-03-27 23:55:07
高三男孩喀纳斯湖失踪,母亲守岸7天后直言放弃,意外竟在此时发生

高三男孩喀纳斯湖失踪,母亲守岸7天后直言放弃,意外竟在此时发生

古怪奇谈录
2025-10-16 10:53:42
激活空港消费势能 越秀商管以运营力驱动广货全球化出圈

激活空港消费势能 越秀商管以运营力驱动广货全球化出圈

环球网资讯
2026-03-27 22:41:05
涉嫌严重违纪违法,安徽一厅干被查

涉嫌严重违纪违法,安徽一厅干被查

网易安徽
2026-03-27 18:42:41
情人关系已落伍!2026爆火的两性关系,第三种最上头

情人关系已落伍!2026爆火的两性关系,第三种最上头

草莓信箱
2026-03-19 10:26:15
你见过哪些闷声发大财的人?网友:干这个买三套房子,两个门面

你见过哪些闷声发大财的人?网友:干这个买三套房子,两个门面

夜深爱杂谈
2026-02-01 18:57:04
奥运冠军“拉拉链露胸”,让耐克绷不住了!

奥运冠军“拉拉链露胸”,让耐克绷不住了!

品牌营销报
2026-02-23 11:31:10
狗仔爆料:当年张凌赫还没红的时候,气质很素,身边白鹿陪伴

狗仔爆料:当年张凌赫还没红的时候,气质很素,身边白鹿陪伴

TVB的四小花
2026-03-27 12:30:49
离谱!姚晨侯雯元绯闻升级,更多亲密互动曝光,曹郁被质疑已再婚

离谱!姚晨侯雯元绯闻升级,更多亲密互动曝光,曹郁被质疑已再婚

壹月情感
2026-03-18 15:22:52
女将军长什么样?

女将军长什么样?

张佳玮写字的地方
2026-03-23 17:04:40
2026-03-28 02:36:49
IT爱好者小尚
IT爱好者小尚
分享IT教育类信息
630文章数 55关注度
往期回顾 全部

科技要闻

杨植麟张鹏夏立雪罗福莉,聊龙虾、聊涨价

头条要闻

男医生给孕妻做彩超 丈夫崩溃撞墙:不过了 明天就离婚

头条要闻

男医生给孕妻做彩超 丈夫崩溃撞墙:不过了 明天就离婚

体育要闻

邵佳一:足球就像一场马拉松

娱乐要闻

范玮琪加盟,官宣《浪姐7》遭全网抵制

财经要闻

我在小吃培训机构学习“科技与狠活”

汽车要闻

与众08,金标大众不能输的一战

态度原创

健康
房产
本地
游戏
公开课

干细胞抗衰4大误区,90%的人都中招

房产要闻

6.8万方!天河员村再征地,金融城西区开发全面提速

本地新闻

在潍坊待了三天,没遇到一个“潍坊人”

分析师称PS5涨价或只是开始!任天堂与微软或跟进

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版