首页 > 语言 > JavaScript > 正文

详解node child_process模块学习笔记

2024-05-06 15:22:23
字体:
来源:转载
供稿:网友

NodeJs是一个单进程的语言,不能像Java那样可以创建多线程来并发执行。当然在大部分情况下,NodeJs是不需要并发执行的,因为它是事件驱动性永不阻塞。但单进程也有个问题就是不能充分利用CPU的多核机制,根据前人的经验,可以通过创建多个进程来充分利用CPU多核,并且Node通过了child_process模块来创建完成多进程的操作。

child_process模块给予node任意创建子进程的能力,node官方文档对于child_proces模块给出了四种方法,映射到操作系统其实都是创建子进程。但对于开发者而已,这几种方法的api有点不同

child_process.exec(command[, options][, callback]) 启动子进程来执行shell命令,可以通过回调参数来获取脚本shell执行结果

child_process.execfile(file[, args][, options][, callback]) 与exec类型不同的是,它执行的不是shell命令而是一个可执行文件

child_process.spawn(command[, args][, options])仅仅执行一个shell命令,不需要获取执行结果

child_process.fork(modulePath[, args][, options])可以用node执行的.js文件,也不需要获取执行结果。fork出来的子进程一定是node进程

exec()与execfile()在创建的时候可以指定timeout属性设置超时时间,一旦超时会被杀死

如果使用execfile()执行可执行文件,那么头部一定是#!/usr/bin/env node

进程间通信

node 与 子进程之间的通信是使用IPC管道机制完成。如果子进程也是node进程(使用fork),则可以使用监听message事件和使用send()来通信。

main.js

var cp = require('child_process');//只有使用fork才可以使用message事件和send()方法var n = cp.fork('./child.js');n.on('message',function(m){ console.log(m);})n.send({"message":"hello"});

child.js

var cp = require('child_process');process.on('message',function(m){ console.log(m);})process.send({"message":"hello I am child"})

父子进程之间会创建IPC通道,message事件和send()便利用IPC通道通信.

句柄传递

学会如何创建子进程后,我们创建一个HTTP服务并启动多个进程来共同做到充分利用CPU多核。

worker.js

var http = require('http');http.createServer(function(req,res){ res.end('Hello,World'); //监听随机端口}).listen(Math.round((1+Math.random())*1000),'127.0.0.1');

main.js

var fork = require('child_process').fork;var cpus = require('os').cpus();for(var i=0;i<cpus.length;i++){ fork('./worker.js');}

上述代码会根据你的cpu核数来创建对应数量的fork进程,每个进程监听一个随机端口来提供HTTP服务。

上述就完成了一个典型的Master-Worker主从复制模式。在分布式应用中用于并行处理业务,具备良好的收缩性和稳定性。这里需要注意,fork一个进程代价是昂贵的,node单进程事件驱动具有很好的性能。此例的多个fork进程是为了充分利用CPU的核,并非解决并发问题.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选