node真的是单线程模式吗
2024-09-01 12:10:47
提到node,我们就可以立刻想到单线程、异步IO、事件驱动等字眼。首先要明确的是node真的是单线程的吗,如果是单线程的,那么异步IO,以及定时事件(setTimeout、setInterval等)又是在哪里被执行的。
其实,按照严格来说,node并不是单线程的。node中存在着多种线程,包括:
- js引擎执行的线程
- 定时器线程(setTimeout, setInterval)
- 异步http线程(ajax)
...
我们平时所说的单线程是指node中只有一个js引擎在主线程上运行。其他异步IO和事件驱动相关的线程通过libuv来实现内部的线程池和线程调度。libv中存在了一个Event Loop,通过Event Loop来切换实现类似于多线程的效果。简单的来讲Event Loop就是维持一个执行栈和一个事件队列,当前执行栈中的如果发现异步IO以及定时器等函数,就会把这些异步回调函数放入到事件队列中。当前执行栈执行完成后,从事件队列中,按照一定的顺序执行事件队列中的异步回调函数。
上图中从执行栈,到事件队列,最后事件队列中按照一定的顺序执行回调函数,整个过程就是一个简化版的Event Loop。此外回调函数执行时,同样会生成一个执行栈,在回调函数里面还有可能嵌套异步的函数,也就是说执行栈存在着嵌套。
也就是说node中的单线程是指js引擎只在唯一的主线程上运行,其他的异步操作,也是有独立的线程去执行,通过libv的Event Loop实现了类似于多线程的上下文切换以及线程池调度。线程是最小的进程,因此node也是单进程的。这样就解释了为什么node是单线程和单进程的。
最新文章
- SSH实战 · 唯唯乐购项目(上)
- Python-Jenkins API使用 —— 在后端代码中操控Jenkins
- xamarin android,UWP 网络类型和IP地址
- 'Could not load NIB in bundle: 'NSBundle xxx/storeFlix.app>; ' with name 'UIViewController-w6Q-ra-j06' and directory 'StoreFlixIpad.storyboardc
- 关于行内元素的margin padding一些说明;background-color的范围
- Uva110 Meta-Loopless Sorts
- Universal Naming Convention (UNC)
- c/c++多级指针
- Maven--生命周期和插件(四)
- 《数据结构、算法及应用》9.(C++实施订单)
- C#单元测试工具包:MvcContrib
- ORALCE 编译过程卡死解决方法。
- db2中left()函数和right()函数对应oracle中的substr()函数
- 第五章 MVC之 FileResult 和 JS请求二进制文件
- VIM 自定义语法高亮配置
- 前端js,后台python实现RSA非对称加密
- ArcGIS Engine 笔记-控件类型
- C++通用WMI接口实现获取Windows操作系统内核版本号
- asp.net实现伪静态
- DNN模型训练词向量原理
热门文章
- Spring源码分析(一)预备篇=》基本知识储备
- MySQL基础(四)常用函数
- 一文了解Mysql
- c++::Mysql::ORM 开发环境搭建
- 提权案例(一)渗透某asp.net网站通过sql server数据库public 提权 思路分享
- shell数组(四)
- Mybaits 源码解析 (二)----- 根据配置文件创建SqlSessionFactory(Configuration的创建过程)
- 玩转PubSubClient MQTT库
- 百万年薪python之路 -- 函数的动态参数
- Linux下zkui的安装