开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
线程是程序执行的最小单位,进程是操作系统分配资源的最小单位一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线进程间相互独立,但同一进程下各线程之间共享程序的内存空间线程上下文切换比进程上下文切换要快。
node进程
node是单线程的,即一个进程只开一个线程node。
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对象