node是单线程的,采用单线程异步非阻塞模式。因为javascript引擎的关系,node默认是单线程,一个node.js应用无法利用多核资源。

Node.js采用事件驱动和异步I/O的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事。

nodejs实现异步、非阻塞:

nodejs其实只有js执行是单线程,I/O显然是其它线程。

js执行线程是单线程,把需要做的I/O交给libuv,自己马上返回做别的事情,然后libuv在指定的时刻回调就行了。

细化一点,nodejs会先从js代码通过node-bindings调用到C/C++代码,然后通过C/C++代码封装一个叫 “请求对象” 的东西交给libuv,这个请求对象里面无非就是需要执行的功能+回调之类的东西,给libuv执行以及执行完实现回调。

总结来说,一个异步 I/O 的大致流程如下:

1、发起 I/O 调用

用户通过 Javascript 代码调用 Node 核心模块,将参数和回调函数传入到核心模块;

Node 核心模块会将传入的参数和回调函数封装成一个请求对象;

将这个请求对象推入到 I/O 线程池等待执行;

Javascript 发起的异步调用结束,Javascript 线程继续执行后续操作。

2、执行回调

I/O 操作完成后,会取出之前封装在请求对象中的回调函数,执行这个回调函数,以完成 Javascript 回调的目的。(这里回调的细节下面讲解)

从这里,我们可以看到,我们其实对 Node.js 的单线程一直有个误会。

事实上,它的单线程指的是自身Javascript运行环境的单线程,Node.js并没有给Javascript执行时创建新线程的能力,最终的实际操作,还是通过Libuv以及它的事件循环来执行的。这也就是为什么 Javascript一个单线程的语言,能在Node.js里面实现异步操作的原因,两者并不冲突。

nodejs是单线程还是多线程_node是多线程还是单线程?相关推荐

  1. Problem 58 怎样判断当前程序链接的是多线程版的Glibc还是单线程版的Glibc?

    Problem58 怎样判断当前程序链接的是多线程版的Glibc还是单线程版的Glibc? Ans: 在Linux程序设计当中,如果一个程序被设计成可以支持单线程或多线程的模式,可以当过弱引用的方法来 ...

  2. 多线程不能不知道的之单线程和多线程的比较

    早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候. 栗子 ...

  3. 【java多线程】多线程为什么跑的比单线程还要慢?!

    问:多线程是不是能加快处理速度? 解析: 在使用多线程时,一定要知道一个道理:处理速度的最终决定因素是CPU.内存等,在单CPU(无论多少核)上,分配CPU资源的单位是"进程"而不 ...

  4. 多线程为什么跑的比单线程还要慢?!

    前言: 面试官:多线程和单线程哪个快? 我凭借微弱的记忆以及正经分析回答:多线程快,因为可以执行多个任务,而单线程只能执行一个任务. 面试官:无论什么情况多线程都比单线程快吗? 我犹豫了一下正经回答: ...

  5. 单线程+多路IO复用 Redis6多线程

    作为单线程,如何监听多个客户端 redis通过io多路复用程序来监听多个socket(客户端连接),然后根据socket需要执行的操作(连接应答(accept).读取(read).写入(write). ...

  6. 为什么nodejs是单进程的_Nodejs探秘:深入理解单线程实现高并发原理

    导语:在我接触Nodejs的时候,听的最多的关键字就是:事件驱动.非阻塞I/O.高效.轻量,是单线程且支持高并发的脚本语言.可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,自己也在 ...

  7. 多线程编程 java_java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般 ...

  8. java是多线程_Java之多线程(一)

    一,前言 ​今天总结一些关于线程方面的知识,说到线程可谓是无人不知,毕竟这东西不管是在工作开发中,还是实际生活中都时时存在着.关于线程方面的内容非常多,从简单的单线程,多线程,线程安全以及到高并发等等 ...

  9. android 多线程 js,JS多线程(web work)

    JS多线程 JS多线程不允许操作DOM 1. 引用Concurrent Thread.js库 用法:Concurrent.Thread.Create(function(){};) 2. Web Wor ...

最新文章

  1. ViewStub 使用注意事项
  2. 汽车和山羊问题matlab_关于博弈的山羊与汽车问题
  3. LB 终面 与 智能家电 的浅析
  4. 图书馆自动化系统 Evergreen 3.3 发布,迁移到 Angular
  5. 炫彩界面库使用方法问题记录
  6. xheditor的使用方法
  7. JVM调优常用参数配置
  8. 第 十 一 天 : 复 习 完 ( 四 )
  9. iOS: TableView如何刷新指定的cell 或section
  10. 明确C++风格的类型转换的用法
  11. php的api数据接口书写实例
  12. 使用TweenMax更方便的创建连续的运动。
  13. web自动化测试 Selenium2 Java自动化测试实战9_3
  14. c语言与或非异或符号怎么打,逻辑运算符的符号
  15. MFC 通用对话框之“查找替换“对话框
  16. JavaScript 全栈工程师培训教程(React.js + Node.js)
  17. 树莓派4B安装WPS解决字体缺失问题
  18. C语言getc函数没错不管用,对比C语言中getc()函数和ungetc()函数的使用
  19. 基于Spring Boot的个人博客系统的设计与实现 毕业设计-附源码271611
  20. 谈微信里的“养生“谣言

热门文章

  1. 鸿蒙开发初体验以及遇到的几点坑
  2. 开关电源ROHS认证|ROHS认证流程|周期费用
  3. Google第一季度业绩超预期 股价盘后大涨
  4. [空间分析] DEM提取山脊线与山谷线
  5. Elasticsearch 总括
  6. matlab 函数不定参数,不需要参数的matlab函数
  7. 我的第一台电脑的故事
  8. Egg 中结合Mongoose操作MongoDB
  9. java手机游戏飞机大战
  10. Android第一次触摸屏幕没有产生事件