Node.js多进程

Node.js多进程

Node.js单线程模式运行的,使用事件处理并发。

exec()

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

process.argv()

当参数为0时

是node的文件绝对地址

当参数为1时

是该文件的绝对地址

当参数为2时

是命令第一个参数。

child_process.exec

回调函数有三个选项,error, stdout, stderr

error 为程序执行的错误,正常执行会返回一个null

stdout 为程序的正常输出

stderr 为程序错误输出

/*master.js*/
const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
	var count = 0;
    var workerProcess = child_process.exec('node support.js ' +i, function (err, std, stderr) {
        if (err) {
            console.log(err.stack);
            console.log('Error code: '+err.code);
            console.log('Signal received: '+err.signal);
        }
        console.log('---------------------');
        console.log(i);
        console.log('stdout: ' + std);
        console.log('stderr: ' + stderr);
    });
 
    workerProcess.on('exit', function (code) {
        console.log('子进程已退出,退出码 '+code);
        console.log('执行顺序' + count++);
    });
}
/*support.js*/
/*support.js*/
console.log("进程 " + process.argv[2] + " 执行。" );

执行结果

PS C:\Users\mingm\Desktop\test> node master.js
子进程已退出,退出码 0
执行顺序0
---------------------
3
stdout: 进程 0 执行。

stderr:
子进程已退出,退出码 0
执行顺序1
---------------------
3
stdout: 进程 1 执行。

stderr:
子进程已退出,退出码 0
执行顺序2
---------------------
3
stdout: 进程 2 执行。

stderr:
PS C:\Users\mingm\Desktop\test>

node.js的执行为异步执行,导致先循环3次,每次提交。

所以输出i的值全为3

由于先运行子进程,子进程执行完毕以后,触发exit事件,

执行

        console.log('子进程已退出,退出码 '+code);
        console.log('执行顺序' + count++);

该两句。

接着执行

        console.log('---------------------');
        console.log(i);
        console.log('stdout: ' + std);
        console.log('stderr: ' + stderr);

执行完毕。

node最大的特点是异步执行。

spawn()方法

同样也是使用指定的命令行,创建新进程。

PS C:\Users\mingm\Desktop\test> node master.js
stdout进程 0 执行。

stdout进程 1 执行。

子进程退出0
stdout进程 2 执行。

子进程退出0
子进程退出0
PS C:\Users\mingm\Desktop\test> node master.js
stdout进程 0 执行。

子进程退出0
stdout进程 1 执行。

stdout进程 2 执行。

子进程退出0
子进程退出0
PS C:\Users\mingm\Desktop\test> node master.js
stdout进程 0 执行。

stdout进程 1 执行。

子进程退出0
stdout进程 2 执行。

子进程退出0
子进程退出0
PS C:\Users\mingm\Desktop\test>

node执行异步相当魔幻

飘忽不定

/*master.js*/
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
	var workerProcess = child_process.spawn('node', ['support.js', i]);

	// 绑定两个事件
	workerProcess.stdout.on('data', (data) => {
		console.log('stdout' + data);
	});

	workerProcess.stderr.on('data', (data) => {
		console.log('stderr', + data);
	});

	// 设置退出事件
	workerProcess.on('close', (code) => {
		console.log('子进程退出' + code);
	});
};
/*support.js*/
console.log("进程 " + process.argv[2] + " 执行。" );

和exec()的区别在于exec()是直接回调函数,而spawn()是直接绑定事件

fork()方法

PS C:\Users\mingm\Desktop\test> node master.js
进程 0 执行。
进程 1 执行。
进程 2 执行。
子进程已经退出0
子进程已经退出0
子进程已经退出0
PS C:\Users\mingm\Desktop\test>
const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
	var worker_process = child_process.fork('support.js', [i]);

	worker_process.on('close', (code) => {
		console.log('子进程已经退出' + code);
	});
}

还是喜欢fork方法。fork很方便。没有那么多的异步让人头疼。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏野路子程序员

从已有安装包(vendor)恢复 composer.json

5305
来自专栏MYSQL轻松学

MySQL binlog日志大小超过限定范围

my.cnf中有两个参数设置: expire_logs_days = 7 #binlog保留时间7天 max_binlog_size = 1G ...

45511
来自专栏GreenLeaves

Oracle 通过数据字典查询系统信息

简介:数据字典记录了数据库系统的信息,他是只读表和视图的集合,数据字典的所有者是sys用户。注:用户只能在数据字典上执行查询操作,而维护和修改是由系统自己完成的...

1985
来自专栏不想当开发的产品不是好测试

查看jar包的jdk版本并降级

用解压工具打开jar包(例子都是用7zip) ? 进入到META-INF目录,查看MANIFEST.MF文件,查看Bulid-Jdk,下图就为1.7.0_55版...

2877
来自专栏赵俊的Java专栏

Python 文件操作

2783
来自专栏别先生

Linux学习笔记(Ubuntu操作系统)之hadoop学习之路

1:检查虚拟机的ip命令:ifconfig 2:普通用户切换root用户命令:su 3:root用户切换普通用户命令:su 用户名 4:普通用户执行系统执行前面...

2447
来自专栏友弟技术工作室

命令行提高用户体验的神器

去闯 ag 比grep,ack更快的递归搜索文件内容 ag,grep,ack性能对比的链接 ag安装 ag ag简单使用 ag tig tig:字符模式下交互...

3499
来自专栏Java成神之路

Java微信开发_03_使用测试号进行开发

今天进行自定义菜单的开发时,发现公众号没有自定义菜单的权限。于是想到用测试号,但微信服务器如何区分你要请求的是公众号还是测试号呢。

813
来自专栏Laoqi's Linux运维专列

nginx的502问题

3515
来自专栏Kubernetes

docker volume源码分析

这是在docker v1.10.3版本的使用过程中,使用convoy 作为volume driver,在一次docker volume remove失败时,使我...

4296

扫码关注云+社区

领取腾讯云代金券