本文介绍: 每个进程总是带有三个流对象child.stdin, child.stdoutchild.stderr。以上发现多次执行main发现执行输出内容顺序有时不同,结果不仅仅是上述两种结果,与子进程退出的速度有关。返回对象拥有ChildProcess实例的所有方法,还有一个内建的通信信道。child_process.exec 使用进程执行命令缓存进程输出多次执行发现spawn的示例一样,也有多种执行结果,与子进程的退出程序有关。以下对上述方法详细说明

Node.js进程

Node.js 是以单线程模式运行,但它使用的是事件驱动处理并发,这样有助于我们在多核 cpu系统创建多个子进程,从而提高性能

每个进程总是带有三个流对象:child.stdin, child.stdoutchild.stderr。他们可能会共享进程的 stdio 流,或者也可以是独立的被导流的流对象。

Node 提供了 child_process 模块创建进程方法有:

以下对上述方法详细说明

exec()

child_process.exec 使用子进程执行命令缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回

使用语法

child_process.exec(command[, options], callback)

exec() 方法返回最大的缓冲区,并等待进程结束,一次性返回缓冲区的内容

示例

support.js 文件代码

console.log("进程 " + process.argv[2] + " 执行。" );

main.js 文件代码

const fs = require('fs');
const child_process = require('child_process');
for(var i=0; i<3; i++) {
  //运行support.js
    var 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])

示例

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])

返回的对象拥有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的示例一样,也有多种执行结果,与子进程的退出程序有关

原文地址:https://blog.csdn.net/tjj3027/article/details/134464741

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_10747.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注