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很方便。没有那么多的异步让人头疼。

目录
相关文章
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
41 1
|
9月前
|
JavaScript
使用 Node.js 多进程提高任务执行效率
使用 Node.js 多进程提高任务执行效率
|
10月前
|
JavaScript
node.js多进程
node.js多进程
58 0
|
Web App开发 缓存 JavaScript
六千字梳理 Node.js 的多进程模型和项目部署流程
本文介绍了 Node.js 中的多进程模型,以及如何将一个基于 Node.js 开发的 Web 应用,部署到服务器上,并且使用 PM2 工具进行管理,最终通过 Nginx 进行代理转发,对外提供服务。
482 0
|
存储 缓存 JavaScript
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
【Node.js 】开发中遇到的多进程‘keylog‘ 事件以及TLS/SSL的解决学习方案实战
|
缓存 JavaScript 中间件
Node.js实战之Node多进程与JXcore 打包深入运用
Node.js实战之Node多进程与JXcore 打包深入运用
Node.js实战之Node多进程与JXcore 打包深入运用
|
2月前
|
JSON JavaScript 前端开发
JS服务端技术—Node.js知识点
本篇文章是我开始系统学习Node.js的一些笔记。如果文中阐述不全或不对的,多多交流。
62 0
JS服务端技术—Node.js知识点
|
3月前
|
JavaScript
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
47 0
|
3月前
|
JavaScript
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
Turndown 源码分析:五、节点相关`root-node.js`和`node.js`
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
70 0