提到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是单线程和单进程的。

最新文章

  1. SSH实战 · 唯唯乐购项目(上)
  2. Python-Jenkins API使用 —— 在后端代码中操控Jenkins
  3. xamarin android,UWP 网络类型和IP地址
  4. 'Could not load NIB in bundle: 'NSBundle xxx/storeFlix.app> ' with name 'UIViewController-w6Q-ra-j06' and directory 'StoreFlixIpad.storyboardc
  5. 关于行内元素的margin padding一些说明;background-color的范围
  6. Uva110 Meta-Loopless Sorts
  7. Universal Naming Convention (UNC)
  8. c/c++多级指针
  9. Maven--生命周期和插件(四)
  10. 《数据结构、算法及应用》9.(C++实施订单)
  11. C#单元测试工具包:MvcContrib
  12. ORALCE 编译过程卡死解决方法。
  13. db2中left()函数和right()函数对应oracle中的substr()函数
  14. 第五章 MVC之 FileResult 和 JS请求二进制文件
  15. VIM 自定义语法高亮配置
  16. 前端js,后台python实现RSA非对称加密
  17. ArcGIS Engine 笔记-控件类型
  18. C++通用WMI接口实现获取Windows操作系统内核版本号
  19. asp.net实现伪静态
  20. DNN模型训练词向量原理

热门文章

  1. Spring源码分析(一)预备篇=》基本知识储备
  2. MySQL基础(四)常用函数
  3. 一文了解Mysql
  4. c++::Mysql::ORM 开发环境搭建
  5. 提权案例(一)渗透某asp.net网站通过sql server数据库public 提权 思路分享
  6. shell数组(四)
  7. Mybaits 源码解析 (二)----- 根据配置文件创建SqlSessionFactory(Configuration的创建过程)
  8. 玩转PubSubClient MQTT库
  9. 百万年薪python之路 -- 函数的动态参数
  10. Linux下zkui的安装