资讯专栏INFORMATION COLUMN

Node.js多进程

sunny5541 / 1438人阅读

摘要:多进程单线程模式运行的,使用事件处理并发。使用子进程的执行命令缓存子进程的输出。子进程退出进程执行。子进程退出子进程退出执行异步相当魔幻飘忽不定绑定两个事件设置退出事件子进程退出进程执行。

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:UsersmingmDesktop	est> node master.js
子进程已退出,退出码 0
执行顺序0
---------------------
3
stdout: 进程 0 执行。

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

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

stderr:
PS C:UsersmingmDesktop	est>

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:UsersmingmDesktop	est> node master.js
stdout进程 0 执行。

stdout进程 1 执行。

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

子进程退出0
子进程退出0
PS C:UsersmingmDesktop	est> node master.js
stdout进程 0 执行。

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

stdout进程 2 执行。

子进程退出0
子进程退出0
PS C:UsersmingmDesktop	est> node master.js
stdout进程 0 执行。

stdout进程 1 执行。

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

子进程退出0
子进程退出0
PS C:UsersmingmDesktop	est>

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:UsersmingmDesktop	est> node master.js
进程 0 执行。
进程 1 执行。
进程 2 执行。
子进程已经退出0
子进程已经退出0
子进程已经退出0
PS C:UsersmingmDesktop	est>
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很方便。没有那么多的异步让人头疼。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96429.html

相关文章

  • 深入理解Node.js 进程与线程(8000长文彻底搞懂)

    摘要:在单核系统之上我们采用单进程单线程的模式来开发。由进程来管理所有的子进程,主进程不负责具体的任务处理,主要工作是负责调度和管理。模块与模块总结无论是模块还是模块,为了解决实例单线程运行,无法利用多核的问题而出现的。 前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过...

    Harpsichord1207 评论0 收藏0
  • 系列3|走进Node.js进程模型

    摘要:例如,在方法中,如果需要主从进程之间建立管道,则通过环境变量来告知从进程应该绑定的相关的文件描述符,这个特殊的环境变量后面会被再次涉及到。 文:正龙(沪江网校Web前端工程师)本文原创,转载请注明作者及出处 之前的文章走进Node.js之HTTP实现分析中,大家已经了解 Node.js 是如何处理 HTTP 请求的,在整个处理过程,它仅仅用到单进程模型。那么如何让 Web 应用扩展到...

    snowell 评论0 收藏0
  • Node.js学习之路14——Process进程

    摘要:在中,只支持单线程。在这种场合下,如果能够使用多进程,则可以为每个请求分配一个进程,从而可以更好地使用服务器端的资源。进程进程对象的属性用于运行应用程序的可执行文件的绝对路径的版本号及其各依赖的版本号当前运行的平台用于读入标准输入流的对象。 Process 在Node.js中,只支持单线程。但是在应用程序中,如果只使用单线程进行操作,从接收请求开始到返回响应为止的这段时间内可能存在很长...

    darry 评论0 收藏0
  • [gist]为什么事件驱动服务器这么火

    摘要:两个事件驱动模型服务器平均每秒处理的请求数为服务器的一倍,而内存降低了一半。事件驱动模型的出现,是为了解决传统服务器与网络工作负载的需求的不匹配,实现高度可伸缩服务器,并降低内存开销。 from http://oyanglul.us 本文基本上这为两篇文章的翻译和整合 -...

    fsmStudy 评论0 收藏0
  • Node.js运行原理、高并发性能测试对比及生态圈汇总

    摘要:模式,单实例多进程,常用于多语言混编,比如等,不支持端口复用,需要自己做应用的端口分配和负载均衡的子进程业务代码。就是我们需要一个调度者,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡。 showImg(https://segmentfault.com/img/remote/1460000019425391?w=1440&h=1080); Nod...

    kamushin233 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<