Node.js事件驱动模型

简介:

一、传统线程网络模型

       在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS、Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完成并发出响应,结束之后线程池回收。

这就会就会带来以下几个问题 :

1.由于线程池中线程个数有限,对于频繁请求时,就会出现等待,严重的甚至会把服务器挂掉

2.对于高并发的时候,为了防止出现脏数据就会使用锁来解决,一些I/O事务可能消耗很长得时间,这样就会出现一些线程等待,效率低下

二、事件驱动模型

      1.在Node.js中有一个事件队列,每个任务都会放入事件队列中,都会留下处理结果的回调函数,事件循环线程(个人感觉有点类似ios中的RunLoop)处理事件队列中的任务,直到回调函数不再存在。

      2. 在无阻塞的情况下,作为一个带有回调的函数被放入事件队列中,事件循环线程中被提取并执行。

      3.当执行过程中遇到I/O阻塞(读取文件、查询数据库、请求套接字、访问远程服务等)时,事件循环线程不会停下等待结果,转而继续执行队列中的下一个任务,不会在事件循环线程中执行。在函数执行时,Node.js在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。

      4.在1中也说了当遇到I/O阻塞,循环线程不会等待结果,转而执行队列中的下一个任务,那是该由谁来执行这个I/O操作呢?

Node.js使用事件回调来避免对阻塞I/O的等待,在后台实现线程池,当遇到I/O阻塞任务时,会从线程池中获取一个线程,将该函数及回调在那里执行,在被阻塞的线程上执行的回调函数仍然可以把事件添加到事件队列中。

 

相关文章
|
2月前
egg.js 24.10sequelize模型-查询单个
egg.js 24.10sequelize模型-查询单个
31 1
egg.js 24.10sequelize模型-查询单个
|
2月前
|
数据库
egg.js 24.9sequelize模型-批量新增和修改器
egg.js 24.9sequelize模型-批量新增和修改器
44 0
egg.js 24.9sequelize模型-批量新增和修改器
|
2月前
egg.js 24.13sequelize模型-字段限制排序分页
egg.js 24.13sequelize模型-字段限制排序分页
51 1
egg.js 24.13sequelize模型-字段限制排序分页
|
19天前
|
JavaScript 前端开发
JavaScript 中的三种事件模型
JavaScript 中的事件模型主要有三种: 传统事件模型(DOM Level 0) 标准事件模型(DOM Level 2) IE 事件模型(非标准,仅限于旧版本的 Internet Explorer)
19 1
|
2月前
|
JavaScript 前端开发 数据可视化
Three.js第2篇,加载glb / gltf模型,Vue加载glb / gltf模型(如何在vue中使用three.js,vue使用threejs加载glb模型)
Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API,使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等。这里记录一下如何在Vue项目中使用Three.js
175 4
Three.js第2篇,加载glb / gltf模型,Vue加载glb / gltf模型(如何在vue中使用three.js,vue使用threejs加载glb模型)
|
2月前
|
Web App开发 JavaScript 前端开发
通过一个实际的例子,介绍 Node.js 的事件驱动编程模式
通过一个实际的例子,介绍 Node.js 的事件驱动编程模式
通过一个实际的例子,介绍 Node.js 的事件驱动编程模式
|
1月前
|
JavaScript 前端开发
JavaScript BOM 浏览器对象模型
JavaScript BOM 浏览器对象模型
|
2月前
|
前端开发 JavaScript TensorFlow
如何将训练好的Python模型给JavaScript使用?
本文介绍了如何将TensorFlow模型转换为Web格式以实现浏览器中的实际应用。首先,简述了已有一个能够检测扑克牌的TensorFlow模型,目标是将其部署到Web上。接着,讲解了TensorFlow.js Converter的作用,它能将Python API创建的GraphDef模型转化为TensorFlow.js可读取的json格式,用于浏览器中的推理计算。然后,详细说明了Converter的安装、用法及不同输入输出格式,并提供了转换命令示例。最后,文中提到了模型转换后的实践步骤,包括找到导出的模型、执行转换命令以及在浏览器端部署模型的流程。
31 3
|
2月前
|
JavaScript 前端开发
JavaScript 提供了多种方法来操作 DOM(文档对象模型)
【5月更文挑战第11天】JavaScript 用于DOM操作的方法包括获取元素(getElementById, getElementsByClassName等)、修改内容(innerHTML, innerText, textContent)、改变属性、添加/删除元素(appendChild, removeChild)和调整样式。此外,addEventListener用于监听事件。注意要考虑兼容性和性能当使用这些技术。
26 2
|
2月前
|
前端开发 JavaScript UED
JavaScript 的事件循环机制是其非阻塞 I/O 模型的核心
【5月更文挑战第9天】JavaScript的事件循环机制是其非阻塞I/O的关键,通过单线程的调用栈和任务队列处理异步任务。当调用栈空时,事件循环从任务队列取出一个任务执行,形成循环。异步操作完成后,回调函数进入任务队列,等待被事件循环处理。微任务如Promise回调在每个宏任务结束后执行。此机制确保JavaScript能高效处理异步操作,不阻塞主线程,提供流畅的用户体验。
26 2