nodejs复习02

process

  • 这个模块是单线程的,无法完全利用多核CPU

基本信息

//程序目录
process.cwd();  //应用程序当前目录
process.chdir('/home'); //改变应用程序的当前目录
process.cwd();

//进程信息
process.pid;  //当前进程pif
process.execPath; //运行当前进程的可执行文件的绝对地址
process.title;  //当前进程名称, 默认与process.execPath相同
process.argv; //当前进程命令行参数数组

//Node信息
process.versions;  //Nodejs版本属性
process.version;  //Nodejs版本号
process.config  //Nodejs配置信息


//系统信息
process.platform;  //系统平台
process.arch;  //cpu架构
process.env;  //shell环境参数变量

输入输出流

//标准输出
console.log = function(data) {
	process.stdout.write(data + '\n')
}

//错误输出
process.stderr.write('err: ' + new Error('err'));

//标准输入
process.stdin.setEncoding('utf8')
process.stdin.on('readable', function () {
	var chunk = process.stdin.read()
	if(chunk !== null) {
		process.stdout.write('Print: ' + chunk + '\n')
	}
})

  .on('end', function () {
  	process.stdout.write('end\n')
  })

kill当前进程

process.on('SIGHUP', function () {
	console.log('SIGHUP');
})

setTimeout(function () {
	console.log('Exiting...');
	process.exit(0)   //该方法杀死当前进程
	console.log('out process id: ' + process.pid);  //这里没有执行
}, 1000)

process.kill(process.pid, 'SIGHUP');   //仅仅是一个信号发送器,并没有杀死进程

异步方法

  • process.nextTick

child_process

  • 这个模块可以通过子进程来实现多核CPU的有效利用

spawm(command, [arg])

var spawn = require('child_process').spawn;

var cat = spawn('cat'); //创建子进程

//控制台输出对象data事件
cat.stdout.on('data', function (data) {
	console.log('stdout: ' + data);
})

cat.on('error', function (code) {
        console.log('cat error: ' + code)
})

cat.on('exit', function (code) {
	console.log('cat exit');
})

cat.on('close', function (code) {
	console.log('cat closed');
})

//控制台输入对象处理
cat.stdin.write('cat on data!\n');
cat.stdin.write('new line data!');
cat.stdin.end();
  • exit事件表示退出,但子进程的标准输入输出流可能仍为开启
  • close事件表示关闭,子进程的所有标准输入输出流都终止时触发
  • 参数code正常是为0,非正常为1~3

exec(command, callback)

var exec = require('child_process').exec;

var cat = exec('cat text.txt', function (error, stdout, stderr) {
	console.log(stdout);
	console.log(stderr);
	if(stderr) {
		console.log(error);
	}
});

两者比较

  • spawn 方法是异步中的异步, 在子进程开始执行时,它就开始从一个流从子进程返回给Node;适合想要子进程返回大量数据给Node操作,如图形处理,读取二进制;
  • exec方法是同步中的异步,它会等到子进程运行结束后再一次性返回所有buffer数据;如果execbuffer体积设置得不够大,会错误失败maxBuffer exceeded;

execFile(file, [arg], callback)

  • exec方法相比, execFile不用启动独立的shell,更加轻量级
var execFile = require('child_process').execFile;

execFile('/bin/ls', ['-lh', '.'], function (error, stdout, stderr) {
	console.log(stdout);
})

fork

  • 只能运行js或可编译到js的语言
var fork = require('child_process').fork;
var cpus = require('os').cpus();

for (var i = 0; i < cpus.length; i++) {
	fork('./work.js')
}
  • 子进程运行完成时并不会自动退出,您需要明确地调用 process.exit()
  • 这些子进程是全新的V8实例,假设每个新的Node需要至少 30 毫秒的启动时间和10MB内存,就是说不能创建成百上千个这样的实例
  • 进程间通信,fork会在主进程和子进程之间直接建立一个IPC管道
//main.js
var fork = require('child_process').fork;
var n = fork('./work.js');


n.on('message', function (m) {
	console.log(m);
})

n.send({main: 'sub'})

//work.js
process.on('message', function (m) {
	console.log(m);
	process.exit()
})

process.send({sub: 'main'})

os

var os = require('os')

os.type();  //操作系统类型
os.platform();  //操作系统平台
os.hostname();  //系统主机名
os.cpus();  //系统内核信息
os.arch();  //系统架构 如x64
os.release();  //系统发行版本
os.uptime();  //系统运行时间
os.totalmem();  //系统内存总量 type
os.freemem();  //系统内存空闲 type
os.tmpdir();  //系统默认临时文件目录: 用户系统中每个操作都会被保存成临时文件放在这
os.networkInterfaces();  //网络接口信息

posted @ 2016-11-19 10:13  JinksPeng  阅读(199)  评论(0编辑  收藏  举报