Node.js是不是单线程吗
这篇文章主要为大家展示了“Node.js是不是单线程吗”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Node.js是不是单线程吗”这篇文章吧。
进程
在操作系统中,对进程的解释:进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
是应用程序的一次运行过程(动态概念)
是系统分配和调度资源的基本单位(进程是一般由程序、数据集合和进程控制块三部分组成)
每个进程有自己独立的空间地址,数据栈(各进程间数据不共享,可通过其他方式进行通信)进程一般有初始态,执行态,等待状态,就绪状态,终止状态五种状态
线程
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。
任务调度和执行的最小单位
一个进程中代码单一执行路线
进程和线程区别
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线进程间相互独立,但同一进程下各线程之间共享程序的内存空间线程上下文切换比进程上下文切换要快
node中进程
node是单线程的,即一个进程只开一个线程node。【推荐学习:《nodejs 教程》】
真的单线程吗?
Node 虽然是单线程,但是其底层是多线程的。事件循环中,libuv库从事件队列中取出任务再分配给不同的线程进行处理。现在硬件条件没有以前那么落后,如果只使用单线程进行操作,则会浪费资源。所以,为了实现多进程处理,充分发挥多核CPU的优势,Node中提供了child_process模块和cluster模块。
child_process模块用于开启多个子进程,子进程中运行不同的命令或执行node.js模块文件、可执行文件
Cluster模块,集群模块,用于实现在Node.js应用程序中开启多个子进程,每个子进程中运行一个Node.js应用程序副本的处理
child_process模块
child_process.spawn():适用于返回大量数据,例如图像处理,二进制数据处理。
child_process.exec():适用于小量数据,maxBuffer 默认值为 200 * 1024 超出这个默认值将会导致程序崩溃,数据量过大可采用 spawn。
child_process.execFile():类似 child_process.exec(),区别是不能通过 shell 来执行,不支持像 I/O 重定向和文件查找这样的行为
child_process.fork(): 衍生新的进程,进程之间是相互独立的,每个进程都有自己的 V8 实例、内存,系统资源是有限的,不建议衍生太多的子进程出来,通常根据系统* CPU 核心数设置。
cluster模块
cluster.fork([env]) 开启子进程,子进程中创建一个Node.js应用程序的实例
isMaster属性和isWorker属性用于判断是运行在主进程中,还是运行在子进程中
Workers属性用于获取所有子进程中运行的worker对象
扩展一下,多线程之间如何通信?
进程间的通信
四种:
消息传递(管道、FIFO、消息队列)
信号量(互斥量、条件变量、读写锁)
共享内存(匿名、命名)
远程过程调用
进程间的通信不仅在node中会遇到,其实在其他语言都会遇到的,当然在面试中也是必提问的问题吧。
以上是“Node.js是不是单线程吗”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341