node.js(九 --- 多进程)
node.js是以单线程的模式运行的,但是使用的是事件驱动来处理并发,这样有助于在多核cpu的系统上创建多个子进程,从而提高性能。
每个子进程总共带有三个流对象:child.stdin、child.stdout和child.stderr;他们可能会共享父进程的stdio流,或者也可以是独立的被导流的流对象。
node.js提供了child_process模块来创建子进程,方法有:exec、spawn、fork;
exec:
child_process.exec使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回;
用法:child_process.exec(command, options, callback);
command: 字符串,将要运行的命令,参数使用空格隔开;
options: 对象,可以是:
cwd,字符串,子进程的当前工作目录;
env,对象环境变量键值对;
encoding,字符串,字符编码(默认:'utf-8');
shell,字符串,将要执行命令的Shell;
timeout,数字,超时时间(默认:0);
maxBuffer,数字, 在stderr中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死(默认:200*1024);
killSignal,字符串,结束信号(默认: 'SiGTERM');
uid, 数字,设置用户进程ID;
gid,数字,设置进程组的ID
callback: 回调函数,包含三个参数error,stdout和stderr.
spawn:
child_process.spawn使用指定的命令行参数创建新进程;
用法: child_process.spawn(command, args, options);
command: 将要运行的命令;
args: Array字符串参数数组;
options Object:
cwd Dtring,子进程的当前工作目录;
env Object,环境变量键值对;
stdio Array/String,子进程的stdio;
detached Boolean,这个子进程将会变成进程组的领导;
uid Number,设置用户进程的ID;
gid Number,设置进程组的ID;
spawn()方法返回流(stdout & stderr),在进程返回大量数据时使用。进程一旦开始执行时spawn()就开始接收响应。
fork:
child_process.fork是spawn()的特殊形式,用于在子进程中运行的模块,如fork('./son.js')相当于spawn('node', './son.js');与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信;
用法:child_process.fork(modulePath, args, options)
modulePath:String,将要在子进程中运行的模块;
args: Array字符串参数数组;
options: Object
cwd String子进程的当前工具目录;
env Object环境变量键值对;
execPath String,创建子进程的可执行文件;
execArgv Array,子进程的可执行文件的字符串参数数组(默认:process.exexArgv);
silent BOOlean,如果为true,子进程的stdin, stdout和stderr将会被关联至父进程,否则,它们将会从父进程中继承;(默认为:false);
uid NUmber,设置用户进程的ID;
gid Number, 设置进程组的ID;
返回的对象除了拥有ChildProcess实例的所有方法,还有一个内建的通信信道。