Node.js学习1:事件循环探究

事件循环 js事件循环node事件循环、浏览器事件循环 事件循环 阅读详情

经常会在各类书籍中看到如下介绍:

    Nodejs的特征是异步式I/O和事件驱动,单线程由Nodejs自己管理,程序在执行时进入时间循环等待下一个事件的到来,每个异步I/O在执行完毕后会被推送到事件队列,等待程序进行处理

既然是单线程怎么实现异步IO呢?今天我们来刨一刨这句话~,首先我们介绍 下阻塞与线程,后文会经常出现,便于大家理解


  什么叫做阻塞?线程在执行过程中如果遇到I/O 操作(磁盘读写、网络通信等)通常要耗费比较长的时间,这时候操作系统会剥夺线程对CPU的控制权,使其暂停,并把资源让给其他线程,这种线程调度方式称为阻塞。当I/O操作完毕的时候,操作系统将这个线程的阻塞状态接触,恢复其对CPU的控制权,令其继续执行,这种模式称为同步I/O或者一部I/O

  非阻塞I/O(异步I/O)则针对所有的I/O操作采取不阻塞的策略,当线程遇到I/O操作时不会以阻塞的方式等待I/O操作结束,而是将I/O请求发送给操作系统,继续执行后面的语句。当操作系统完成I/O操作后以事件的形式通知执行I/O操作的线程,线程会在特定的时间处理这个事件。为了处理异步I/O必须有时间循环,不断检查是否有未处理的事件,依次予以处理。

  在阻塞模式下,一个线程只能处理一个任务,要想提高吞吐量必须通过多线程。而在非阻塞模式下,一个线程永远在执行计算操作,所以这个线程的CPU核心利用率永远是100%,减少了多线程中创建线程、线程切换带来的事件消耗。


  上一段代码解释问题

var fs = require('fs');
fs.readFile("txt/io.txt","UTF-8",function(err,data){
  if(err){
    console.log(err);
  }else{
    console.log(data);
  }
});
console.log("读取文件完毕。。。。");
  大家肯定知道答案,因为readFile是一个异步I/O操作,按照上文说的非阻塞原理先输出I/O后面的代码,等readFile()操作执行完毕后操作系统发送一个事件给执行readFile的线程,线程在回调函数里执行后续操作,输出结果如下

读取文件完毕。。。。
hello world !

   上一张图片

  

  打个比方

   Nodejs在执行过程中会维护一个事件循环队列,程序在执行过程中进入事件循环列等待下一个事件到来,每个异步式I/O请求完成后都会被推送到事件队列,等待程序进行处理。而且Nodejs是单线程的,但是Nodejs所处的环境是多线程的,你调用的Nodejs功能可能是有底层C++的多个服务提供的,但是同一时刻系统只运行你的一个Nodejs事件回调函数。也就是说,除了你的Nodejs程序,其他所有的程序都是多线程的。

  举个例子,我们写的js代码就像是一个国王,而nodejs给国王提供了很多仆人。早上,一个仆人叫醒了国王,问他有什么需要。国王给他一份清单,上面列举了所有需要完成的任务,然后睡回笼觉去了。当国王回去睡觉之后,仆人才离开国王,拿着清单,给其它的仆人一个个布置任务。仆人们各自忙各自的去了,直到完成了自己的任务后,才回来把结果禀告给国王。国王一次只召见一个人,其它的人就在外面排着队等着。国王处理完这个结果后,可能给他布置一个新的任务,或者就直接让他走了,然后再召见下一个人。等所有的结果都处理完了,国王就继续睡觉去了。直接有新的仆人完成任务后过来找他。这就是国王的幸福生活。在nodejs中,有一个队列(先进先出),保存着一个个待执行的任务。第一个任务就是我们写的js代码,它最先被执行(相当于国王给第一个仆人任务清单)。在它执行完以后(国王睡回笼觉去了),其它的任务才会加到队列上(相当于第一个仆人按照清单给其它仆人分配任务)。


  适应场景

  由于Nodejs的以上特性,使他特别适合非计算密集且并发访问量要求严格的场景。如聊天服务器,综合服务类网站或者电子商务网站服务器。具体点说:当应用程序需要处理大量的输入/输出而在客户端发出响应之前,应用程序并不需要进行复杂的处理的场景。

  还有,传统的服务器端语言(如,Java PHP)为每个客户连接创建一个新的线程(约为2M),理论上8G的内存服务器可以同时连接的最大用户为4000,。可以看出,一个主要的平静就是服务器所支持的最大同时连接用户。

  Nodejs修改了客户端到服务器的连接方法,因为她并不是为每个用户连接创建一个线程,避免了线程的切换,而是为每个客户端连接触发一个在Nodejs内部进行处理的事件,同样8G内存的服务器可以同时连接的最大用户量变为了几万。





 

一分钟详解PCL中点云配准技术 原文首发于微信公众号「3D视觉工坊」: 一分钟详解PCL中点云配准技术 本文是对前两篇文章:点云配准(一 两两配准)以及3D点云(二 多福点云配准)的补充,希望可以在一定程度上帮助大家对点云配准理解地更为深刻。 一 PCL中点云配准技术的简单实现 在同一文件夹下,有测试数据文件monkey.ply,该文件是利用Blender创建的默认Monkey模型。 利用如下代码,将初始点云(图中绿色点云)... 阅读详情

相关推荐

错误代码:11300001 数据集 [xxx] 配置错误“=”附近有语法错误(原理分析)

错误代码:11300001 数据集 [1_Workshift] 配置错误“=”附近有语法错误。

码农研究僧的博客 891

nodejs事件循环

主线程将所有任务都放在循环队列中,然后由底层的libuv库从循环事件队列中取出任务分配给不同的线程去处理,主线程同时也会进行回调处理,整个过程形成事件循环nodejs实现异步机制的核心便是libuv,libuv承担着nodejs文件、网络等异步任务的沟通桥梁通过事件驱动模型实现了高并发和异步 I/O ,适合处理I/O密集型任务。

cxz 2143

深入掌握JavaScript Node.js开发

本文还有配套的精品资源,点击获取 简介:JavaScript是前端开发中的主导语言,在Node.js环境下的服务器端编程中也显示出重要性。Node.js是一个基于V8引擎的跨平台JavaScript运行环境,具有事件驱动和非阻塞I/O特性,适用于构建高性能的并发服务器。该压缩包文件可能包含有关Node.js核心概念和模块的资料,比如模块化设计、文件系统操作、HTTP服务器创...

weixin_28809949的博客 1645

Nodejs的循环机制

nodejs 事件循环

小蜜蜂的博客 1150

Node.js事件循环

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?当Node.js启动时,初始化EventLoop,处理输入的代码脚本这些脚本API会被异步调用,process.nextTick方法会开始处理事件循环。整个过程分为六个阶段,timers、I/O callbacks、idle,prpare、poll、check、close callbacks。

前端御书房 551

深入分析Node.js事件循环消息队列

多数的网站不需要大量计算,程序花费的时间主要集中在磁盘 I/O 和网络 I/O 上面 SSD读取很快,但和CPU处理指令的速度比起来也不在一个数量级上,而且网络上一个数据包来回的时间更慢: 一个数据包来回的延迟平均320ms(我网速慢,ping国内网站会更快),这段时间内一个普通 cpu 执行几千万个周期应该没问题 因此异步IO就要发挥作用了,比如用多线程,如果用 Java 去读一个文件,这...

weixin_34067980的博客 945

JavaScript实现循环队列(ES5动态原型模式)

循环队列的一个例子就是击鼓传花游戏 需要原队列结构 function Queue() { this.items = []; if (typeof this.enqueue != 'function') { Queue.prototype.enqueue = function(element) { this.items.push(elemen...

qq_40816360的博客 384

Node.js JavaScript 事件循环的关系

在现代Web开发中,Node.js和JavaScript都是不可或缺的一部分。而理解它们之间的关系,特别是事件循环的概念,对于开发高效、响应迅速的应用程序至关重要。在这个博客中,我们将深入探索事件循环的工作原理,并且结合Node.js的特性,通过示例代码进一步阐明两者之间的联系。

有我更精彩的博客 1601

深入理解JavaScript的事件循环(Event Loop) 一、什么是事件循环

深入理解JavaScript的事件循环(Event Loop) 一、什么是事件循环 JS的代码执行是基于一种事件循环的机制,之所以称作事件循环,MDN给出的解释为因为它经常被用于类似如下的方式来实现 while (queue.waitForMessage()) { queue.processNextMessage(); } 如果当前没有任何消息queue.waitForMes...

tzllxya的博客 2万+

Node.js事件循环

Node.js事件循环是一个 Event Loop,通过异步回调函数的方式实现非阻塞的处理。事件循环会在主线程上不断地执行,监听和处理事件,执行相应的回调函数。Node.JS事件循环比浏览器端复杂很多。V8引擎解析JavaScript脚本。解析后的代码,调用Node API。libuv 库(C++)负责Node API的执行。它将不同的任务分配给不同的线程,形成一个事件循环,以异步的方式将任务的执行结果返回给V8引擎。V8引擎再将结果返回给用户。

小秀的博客 2329

JS事件循环

JS 引擎是单线程的,直白来说就是一个时间点下 JS 引擎只能去做一件事情,而 Java 这种多线程语言,可以同时做几件事情。JS 做的任务分为同步和异步两种,所谓 “异步”,简单说就是一个任务不是连续完成的,先执行第一段,等做好了准备,再回过头执行第二段,第二段也被叫做回调;同步则是连贯完成的。像读取文件、网络请求这种任务属于异步任务:花费时间很长,但中间的操作不需要 JS 引擎自己完成,它只用等别人准备好了,把数据给他,他再继续执行回调部分。如果没有特殊处理,JS 引擎在执行异步任务时,应该是存在等待的

weixin_45730243的博客 8196

什么是javascript的事件循环

本篇讲解什么是javascript的事件循环事件循环的运行机制和执行顺序,理解事件循环对于编写高效、流畅的 JavaScript 代码至关重要。

Sherry Tian的博客 1966

JavaScript中事件循环Nodejs事件循环

1.JavaScript中事件循环 可以参考《JavaScript忍者秘籍第二版》第十三章,讲解的很好。 JavaScript中事件循环,主要就在理解宏任务和微任务这两种异步任务。 宏任务(macrotask): setTimeOut 、 setInterval 、 setImmediate 、 I/O 、 各种callback、 UI渲染 、messageChannel等 优先级:主代码块 &g...

yangyang的专栏 5175

JavaScript 事件循环:从起源到浏览器再到 Node.js

很多文章都在讨论事件循环 (Event Loop) 是什么,而几乎没有人讨论为什么 JavaScript 中会有事件循环。博主认为这是为什么很多人都不能很好理解事件循环的一个重要原因 ——...

淘系技术 1034

jsnode事件循环区别

JavaScript是一门单线程语言,同一时间只能做一件事,但并不意味着单线程就是阻塞,而实现单线程非阻塞的方式就是事件循环。从上面可以看出,同步任务进入主线程,异步任务进入任务队列,主线程内的任务执行完毕为空,会去读取任务队列对应的任务,推入主线程执行。上述过程不断重复就是事件循环机制。

wyzqhhhh的博客 913

JavaScript 事件循环(EventLoop) —— 浏览器 & Node

JavaScript 事件循环(EventLoop) —— 浏览器 & Node

weixin_43822185的博客 1008

深入剖析:Koa 框架如何高效利用 Node.js 事件循环

深入剖析:Koa 框架如何高效利用 Node.js 事件循环

嗨,欢迎来到我的 CSDN 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 4545

node.js事件循环详解

Node.js 中的事件循环是一个高效的异步处理机制,它允许 Node.js 在单线程中处理大量的并发 I/O 请求,而不会阻塞程序的执行。理解事件循环的机制对于优化 Node.js 应用程序的性能至关重要,尤其是在处理大量 I/O 操作时。通过合理使用异步 API 和微任务、宏任务的优先级,可以确保应用程序能够高效地执行并响应请求。

m0_46335150的博客 1461

JavaScript 事件循环:从起源到浏览器再到 Node

内部队列(Microtask Queue),即 JavaScript 语言内部的事件队列,在 HTML 标准中,并没有明确规定这个队列的事件源,通常认为有以下几种:Promise 的成功 (.then) 失败 (.catch)Object.observe (已废弃)

2401_84094029的博客 957

什么是事件循环(Event Loop)?浏览器和 Node.js 中的事件循环有什么区别?

事件循环是 JavaScript 实现异步编程的核心机制之一,用于协调同步代码、异步任务(宏任务、微任务)的执行顺序,避免代码阻塞。同步任务进入主线程,即主执行栈,异步任务进入任务队列,主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。上述过程的不断重复就事件循环。详细说就是:先进行同步任务、执行过程中遇到宏任务或微任务放到各自队列。同步任务执行完了以后先查看微任务队列中有没有任务,执行队列所有任务以后再取一个宏任务进行执行,这样一个循环往复的过程就是事件循环

qq_52869537的博客 1202

hx-108收音机原理图和pcb版图

学生作业画的hx-108收音机的原理图和pcb版图,尤其是pcb版图,画的很不错

上一篇: 利用栈将输入的十进制数及一些基本的栈操作
下一篇: glade使用与GTK+学习初步
阿懒先生
博客等级 码龄14年 12粉丝 34原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值