zoukankan      html  css  js  c++  java
  • 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 + '
    ')
    }
    
    //错误输出
    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 + '
    ')
    	}
    })
    
      .on('end', function () {
      	process.stdout.write('end
    ')
      })
    

    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!
    ');
    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();  //网络接口信息
    
    
  • 相关阅读:
    2016年蓝桥杯B组C/C++决赛题解
    2016年蓝桥杯B组C/C++决赛题目
    线段树区间更新 费马小定理|魔豆传奇
    2015年蓝桥杯B组C/C++决赛题解
    欧拉线性筛 与 欧拉函数 + 几道例题
    2015年蓝桥杯B组C/C++决赛题目
    2017年蓝桥杯B组C/C++决赛题解
    2017年蓝桥杯B组C/C++决赛题目
    2019 蓝桥杯国赛 B 组模拟赛 题解
    2018年蓝桥杯B组C/C++决赛题解
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/6079968.html
Copyright © 2011-2022 走看看