进程是非常重要的一个概念,尤其对于单线程的JavaScript来说,Node.js做好进程管理是在一些负载性能方面,能体现出巨大价值。尤其在支撑公司级别的一些大型项目,多进程管理是必不可少的。本文将结合最近的畅销书《Koa开发:入门、进阶与实战》中的内容,具体讲述Node.js进程相关的知识。
进程的概念
在一些面试中,面试官会经常问一个问题,进程和线程有什么区别。这是一个老生常谈的问题了,但是很多候选人的回答都比较书面化,比如这样的回答:进程是资源分配的最小单位,线程是CPU调度的最小单位。说实话,如果我是一个小白,听到这样的答案,我还是不能够理解进程和线程到底是什么。
其实我们每个人对于新概念的理解都是需要一些过程的,但是如果能够类比成比较熟悉的一些场景的话,理解会更快一点。比如,我们可以把一列火车理解为一个进程,一节车厢理解为一个线程。就是说,线程必须在进场上执行,就像单独的一节车厢无法运行,但是装在一列火车上就可以跑了。进程与进程间是互不干涉的,好比一列火车由于故障停运了,并不影响另一列火车正常运行,但是如果线程坏了,那进程也就崩掉了,可以理解,如果一节车厢坏掉了,那火车基本也就不能正常运行了。
创建多进程
在成熟的Node.js项目中,基本都会提供多进程功能,主要有两个好处:一是目前大多数的服务器都是多核的,为了更好利用服务器资源,提高性能优势;二是进程之间互不影响,万一其中一个进程崩掉,还有其他进程正常运行,不影响线上业务。
Node.js创建多进程共有三种方式:
● child_process.exec:使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
● child_process.spawn:使用指定的命令行参数创建新进程。
● child_process.fork:是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork('./son.js') 相当于spawn('node', ['./son.js']) 。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。
接下来,我们通过实例来对这三种创建方式进行理解。假设现在有一个主进程,要