Node.js使用EXEC方法开启子进程

  • Node.js使用EXEC方法开启子进程已关闭评论
  • 767 views
  • A+
所属分类:JavaScript
广告也精彩
本文预计阅读时间 12 分钟

使用EXEC方法开启子进程
child_process.exec(command,[options],[callback]);
cwd:略 env:略 encoding:略
timeout:属性值为一个整形,用于指定子进程的超时时间,单位为毫秒、当子进程的运行时间超过该时间时,Node.js将使用killSignal属
性值所指定的信号强制关闭该子进程
maxbuffer:属性值为一个整形,用于指定用于缓存标准输出数据及标准错误输出数值,子进程将被强制关闭
killSignal:用于指定关闭子进程的信号,默认属性值为"SIGTERM"
exec方法返回一哥隐式创建的子进程的ChildProcess对象
exec方法与spwan方法的最大区别是,spawn方法可以在父进程中实时接受子进程中输出的标准输出流数据或标准错误输出流数据,因
此是一个异步方法。如果使用exec方法,那么父进程必须等待子进程中的标准输出流数据或标准错误输出流数据全部缓存完毕后才能接收
到数据,因此是一个同步方法。
//使用exec方法开启子进程
var cp =require('child_process');
var sp1= cp.exec('node test1.js one two three four',{cwd:'./test'},function(err,stdout,stderr){
if(err){
console.log('子进程开启失败:'+err);
process.exit();
}else{
console.log('子进程标准输出:'+stdout.toString());
sp2.stdin.write(stdout.toString());
}
});
var sp2 = sp.exec('node test2.js',function(err,stdout,stderr){
process.exit();
});
//test2.js文件中的代码
var fs = require('fs');
var out = fs.createWriteStream('./message.txt');
process.stdin.on('data',function(data){
out.write(data);
process.exit();
});
使用execFile方法开启子进程
var cp =require('child_process');
var sp1 = cp.execFile('test1.bat',['one','two','three','four'],{cwd:'./test'},function(err,stdout,stderr){
if(err){
console.log('子进程开启失败:'+err);
process.exit();
}else{
console.log('子进程标准输出:'+stdout.toString());
sp2.stdin.write(stdout.toString());
}
});
var sp2 = cp.execFile('test2.bat');
使用那个fork方法创建worker对象
var cluster = require('cluster');
var http = require('http');
if(cluster.isMaster){
cluster.fork();
console.log('这段代码被运行在主进程中');
}else{http.createServer(function(req,res){
if(req.url !== '/favicon.ico'){
console.log('这段代码被运行在子进程中。');
}
}).listen(1337);
} 该应用
程序将会向主进程发送一个反馈信息,当主进程接收到反馈信息后,触发online事件
cluster.on('online',function(worker){
//事件回调函数代码略
});
online事件与fork事件的区别在于:当在主进程中尝试用 fork方法开启子进程时,触发fork事件,当在主进程中尝试运行子进程中的
Node.js应用程序时,触发online事件
当在子进程中运行的Node.js应用程序中调用服务器的listen方法后,该服务器开始对指定地址及端口进行监听,同时触发listening事件
cluster.on('listening',function(worker,address){
//事件回调函数代码略
});
第一个参数值为使用fork方法开启子进程返回的worker对象
第二个参数为一个对象adress 属性为:
adress,port,adressType(属性值为服务器监听的地址类型)
cluster.setupMaster([settings])
exec:属性值为当前在正在运行的Node.js应用程序中的主模块文件的 完整路径文件名
args:运行子进程中的Node.js应用程序时需要使用的参数
slient:布尔值,当为false时,子进程对象与主进程对象共享标准输入/输出,当属性为true时,子进程对象与主进程对戏那个不共享标准输
入/输出。默认值为false
//使用setupMaster方法指定子进程中运行的文件
var cluster = require('cluster);
cluster.setupMaster({exec:"child.js"});
cluster.fork();
console.log("这段代码被运行在主进程中");
console.log("cluster.settings属性值:%j",cluster.settings);
//child.js文件中的代码
var http = require('http');
http.createServer(function(req,res){
console.log("这端代码运行在子进程中");
}).listen(1337);
//在多个进程中运行HTTP服务器
var cluster = require("cluster");
var http =require('http');
if(cluster.isMaster){
cluster.fork();
cluster.fork();
}else{
http.createServer(req,res){
if(req.url!=="/favicon.ico"){
var sum - 0;
for(var i =0;i<5000;i++){
sum += i;
} r
es.writeHead(200);
res.write("客户端请求在子进程"+ cluster.worker.id + "中被处理。");
res.end("sum="+sum);
}
}.listen(1337);} //设定子进程对象使用
独立的标准输入/输出
var cluster = require("cluster");
var http =require('http');
if(cluster.isMaster){
cluster.setupMaster({silent:true});
var worker = cluster.fork();
worker.porcess.stdout.on("data",function(data){
console.log("接收到客户端请求,目标地址为:"+data);
});
}else{
http.createServer(function(){
if(req.url!=="/favicon.ico"){
res.end('您好\n');
process.stdout.write(reg.url);
}
}).listen(1337);
} wo
rker对象的方法与事件
//worker对象的online事件回调函数的使用实例
var cluster = require('cluster');
var http = require('http');
if(cluster.isMater){
var worker = cluster.fork();
console.log("这段代码运行在主线程");
worker.on('onnline',function(){
console.log("已接收到子进程"+worker.id.toString()+"的反馈信息。");
});
}else{
http.createServer(function(req,res){
if(req.url!=="/favicon.ico"){
res.end('您好\n');
console.log("这段代码被运行在子进程中");
}
}).listen(1337);
} //
send方法的使用实例
var cluster= require('cluster');
cluster .setupMaster({
exec:"child.js"
});
var worker = cluster.fork();
worker.on("message",function(){
console.log("父进程接收到消息:",m);
process.exit();
});
worker.send({userName:"陆凌牛"});
//主进程与子进程共享socket端口对象
var cluster = require('cluster');
var http = require('http');
var net = require('net');
cluster.setupMaster({
exec:"child.js"
});
var worker = cluster.fork();
var server = require('net').createServer();server.on('connection',function(socket){
if(socket.remoteAddress!=='192.168.1.100'){
worker.send('socket',socket);
return ;
} s
ocket.end('客户端请求被主进程处理');
});
server.listen(42367,'192.168.1.100');
worker.on('message',function(m,socekt){
socket.end('子进程返回消息:'+m);
});
//child.js模块文件中的代码
process.on('message',function(m,socket){
if(m=='socket'){
socket.end('客户端请求被子进程处理');
process.send('客户端请求被子进程处理',socket);
}
});
//kill方法的使用实例
var worker = cluster.fork();
worker.process.stdout.on('data',function(data){
console.log("接收到客户端请求,目标地址为:"+data);
worker.kill();
});

weinxin
九四君博客站长语录
欢迎关注订阅‘爱君娱乐科技’微信公众号,本站的资源也会上传到‘爱君娱乐科技’公众号。
广告也精彩