当前位置: 首页 > news >正文

nodejs处理高并发的原理机制

1、每个Node.js进程只有一个主线程在执行程序代码,形成一个执行栈(execution context stack)。

2、主线程之外,还维护了一个"事件队列"(Event queue)。当用户的网络请求或者其它的异步操作到来时,node都会把它放到Event Queue之中,此时并不会立即执行它,代码也不会被阻塞,继续往下走,直到主线程代码执行完毕。

3、主线程代码执行完毕完成后,然后通过Event Loop,也就是事件循环机制,开始到Event Queue的开头取出第一个事件,从线程池中分配一个线程去执行这个事件,接下来继续取出第二个事件,再从线程池中分配一个线程去执行,然后第三个,第四个。主线程不断的检查事件队列中是否有未执行的事件,直到事件队列中所有事件都执行完了,此后每当有新的事件加入到事件队列中,都会通知主线程按顺序取出交EventLoop处理。当有事件执行完毕后,会通知主线程,主线程执行回调,线程归还给线程池。

4、主线程不断重复上面的第三步。

总结:

我们所看到的node.js单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O,这便是node单线程和事件驱动的精髓之处了。

转载于:https://juejin.im/post/5c6a2059f265da2dca3852f6

相关文章:

  • 关于List、List?、ListObject的区别
  • 如何合理的规划jvm性能调优
  • 异步
  • 这一次,彻底弄懂TCP三次握手,四次挥手
  • 线程的等待和唤醒
  • js中forEach回调同异步问题
  • 整行读字符串且需分割计算字符串个数
  • 比特大陆新一轮裁员50%,回应称系人员调整
  • zabbix linux系统模板更新
  • 2019.2.20 c++ 知识梳理
  • 微信全局登录设计与实现
  • 朝鲜APT集团Lazarus通过KEYMARBLE Backdoor瞄准俄罗斯组织
  • Less 日常用法
  • 手机端车牌号码键盘的vue组件
  • 回归生活:清理微信公众号
  • Google 是如何开发 Web 框架的
  • [数据结构]链表的实现在PHP中
  • 【翻译】babel对TC39装饰器草案的实现
  • es6要点
  • Facebook AccountKit 接入的坑点
  • Java,console输出实时的转向GUI textbox
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript创建对象的四种方式
  • javascript从右向左截取指定位数字符的3种方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • mysql外键的使用
  • Mysql优化
  • STAR法则
  • vue-router 实现分析
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 学习使用ExpressJS 4.0中的新Router
  • 自动记录MySQL慢查询快照脚本
  • Linux权限管理(week1_day5)--技术流ken
  • # 达梦数据库知识点
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define
  • #数学建模# 线性规划问题的Matlab求解
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (补)B+树一些思想
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 设计一套高性能的弱事件机制
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET企业级应用架构设计系列之结尾篇
  • .NET与 java通用的3DES加密解密方法
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Transactional 详解
  • [ JavaScript ] JSON方法
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [04] Android逐帧动画(一)
  • [30期] 我的学习方法
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据