北京孤儿院做义工网站,仙居网站开发,响应式旅游网站模板,wordpress文本编辑插件[node]Node.js多线程 Node.js 多进程exec()使用语法示例 spawn()使用语法示例 fork()使用语法示例 Node.js 多进程
Node.js 是以单线程的模式运行的#xff0c;但它使用的是事件驱动来处理并发#xff0c;这样有助于我们在多核 cpu 的系统上创建多个子进程#xff0c;从而提… [node]Node.js多线程 Node.js 多进程exec()使用语法示例 spawn()使用语法示例 fork()使用语法示例 Node.js 多进程
Node.js 是以单线程的模式运行的但它使用的是事件驱动来处理并发这样有助于我们在多核 cpu 的系统上创建多个子进程从而提高性能。
每个子进程总是带有三个流对象child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流或者也可以是独立的被导流的流对象。
Node 提供了 child_process 模块来创建子进程方法有
exec - child_process.exec 使用子进程执行命令缓存子进程的输出并将子进程的输出以回调函数参数的形式返回。spawn - child_process.spawn 使用指定的命令行参数创建新进程。fork - child_process.fork 是 spawn()的特殊形式用于在子进程中运行的模块如 fork(’./son.js’) 相当于 spawn(‘node’, [’./son.js’]) 。与spawn方法不同的是fork会在父进程与子进程之间建立一个通信管道用于进程之间的通信。
以下对上述方法详细说明
exec()
child_process.exec 使用子进程执行命令缓存子进程的输出并将子进程的输出以回调函数参数的形式返回。
使用语法
child_process.exec(command[, options], callback)command:字符串,将要运行的命令,参数使用空格隔开options 对象属性包括 cwd 字符串子进程的当前工作目录env对象, 环境变量键值对encoding 字符编码(默认:utf8)shell 字符串将要执行命令的 Shell(默认: 在 UNIX 中为/bin/sh 在 Windows 中为cmd.exe Shell 应当能识别 -c开关在 UNIX 中或 /s /c 在 Windows 中。 在Windows 中命令行解析应当能兼容cmd.exe)timeout数字超时时间(默认:0)maxBuffer数字 在 stdout 或 stderr 中允许存在的最大缓冲(二进制)如果超出那么子进程将会被杀死 (默认: 200*1024)killSignal 字符串结束信号(默认SIGTERM)uid数字设置用户进程的 IDgid数字设置进程组的 ID callback 回调函数包含三个参数error, stdout 和 stderr。
exec() 方法返回最大的缓冲区并等待进程结束一次性返回缓冲区的内容。
示例
support.js 文件代码
console.log(进程 process.argv[2] 执行。 );main.js 文件代码
const fs require(fs);
const child_process require(child_process);
for(var i0; i3; i) {//运行support.jsvar workerProcess child_process.exec(node support.js i, function (error, stdout, stderr) {if (error) {console.log(error.stack);console.log(Error code: error.code);console.log(Signal received: error.signal);}console.log(stdout: stdout);console.log(stderr: stderr);});workerProcess.on(exit, function (code) {console.log(子进程已退出退出码 code);});
}执行以上代码,main中代码运行support
$ node main.js 以下为输出结果
子进程已退出退出码 0
stdout: 进程 0 执行。 stderr:
子进程已退出退出码 0
stdout: 进程 1 执行。 stderr:
子进程已退出退出码 0
stdout: 进程 2 执行。 stderr: spawn()
child_process.spawn 使用指定的命令行参数创建新进程
使用语法
child_process.spawn(command[, args][, options])command:将要运行的命令args:Array 字符串参数数组options Object对象 cwd(String): 子进程的当前工作目录env(Object): 环境变量键值对stdio(Array|String): 子进程的 stdio 配置detached(Boolean): 这个子进程将会变成进程组的领导uid(Number): 设置用户进程的 IDgid(Number): 设置进程组的 ID spawn() 方法返回流 (stdout stderr)在进程返回大量数据时使用。进程一旦开始执行时 spawn() 就开始接收响应。
示例
support.js 文件代码
console.log(进程 process.argv[2] 执行。 );main.js 文件代码
const child_process require(child_process);
for (var i 0; i 3; i) {var workerProcess child_process.spawn(node, [temp1.cjs, i]);workerProcess.stdout.on(data, function (data) {console.log(stdout: data);});workerProcess.stderr.on(data, function (data) {console.log(stderr: data);});workerProcess.on(close, function (code) {console.log(子进程已退出退出码 code);});
}执行以上代码,main中代码运行support
$ node main.js 以下为输出结果
stdout: 进程 0 执行。子进程已退出退出码 0
stdout: 进程 1 执行。 stdout: 进程 2 执行。 子进程已退出退出码 0
子进程已退出退出码 0或者
stdout: 进程 0 执行。子进程已退出退出码 0
stdout: 进程 1 执行。 子进程已退出退出码 0
stdout: 进程 2 执行。子进程已退出退出码 0以上发现多次执行main发现执行输出内容的顺序有时不同结果不仅仅是上述两种结果与子进程退出的速度有关
fork()
child_process.fork 是 spawn() 方法的特殊形式用于创建进程
使用语法
child_process.fork(modulePath[, args][, options])modulePath(String):将要在子进程中运行的模块args(Array): 字符串参数数组options(Object):对象 cwd(String):子进程的当前工作目录env(Object): 环境变量键值对execPath(String):创建子进程的可执行文件execArgv(Array):子进程的可执行文件的字符串参数数组(默认:process.execArgv)silent(Boolean):如果为true子进程的stdinstdout和stderr将会被关联至父进程否则它们将会从父进程中继承。(默认为false)uid(Number):设置用户进程的 IDgid(Number):设置进程组的 ID
返回的对象拥有ChildProcess实例的所有方法还有一个内建的通信信道。
示例
support.js 文件代码
console.log(进程 process.argv[2] 执行。 );main.js 文件代码
const child_process require(child_process);
for (var i 0; i 3; i) {var worker_process child_process.fork(temp1.cjs, [i]);worker_process.on(close, function (code) {console.log(子进程已退出退出码 code);});
}
执行以上代码,main中代码运行support
$ node main.js 以下为输出结果
进程 0 执行。
子进程已退出退出码 0
进程 1 执行。
进程 2 执行。
子进程已退出退出码 0
子进程已退出退出码 0多次执行发现同spawn的示例一样也有多种执行结果与子进程的退出程序有关