Process
在Node.js中,只支撑单线程。然则在应用递次中,假如只运用单线程举行操纵,从吸收要求最先到返回相应为止的这段时候内能够存在很长的一段等待时候。在这类场所下,假如能够运用多历程,则可以为每一个要求分派一个历程,从而能够更好地运用服务器端的CPU资本。为了完成多线程处置惩罚,Node.js中供应了
child_process
模块与
cluster
模块,个中的
child_process
模块用于完成在Node.js应用递次中开启多个子历程,并在各个子历程中运转种种差别的敕令或实行Node.js模块文件,可实行文件的处置惩罚,
cluster
模块用于完成在Node.js应用递次中开启多个子历程,在每一个子历程中运转一个Node.js应用递次副本的处置惩罚。
1. 历程
1.1 历程对象的属性
-
process.execPath
: 用于运转应用递次的可实行文件的绝对途径 -
version
: Node.js的版本号 -
versions
: Node.js及其各依靠的版本号 -
platform
: 当前运转Node.js的平台 -
stdin
: 用于读入规范输入流的对象。默许情况下,规范输入流处于停息状况,比方恢复读取规范输入流process.stdin.resume()
-
stdout
: 用于写入规范输出流的对象 stderr
: 用于写入规范毛病输出流的对象- 与其他写入流数据的对象差别,
process.stdout
对象与process.stderr
对象的写数据操纵是一种壅塞型操纵 - 只要当运用其他读取流数据的对象的
pipe
要领,而且将process.stdout
对象或process.stderr
对象作为目的对象的时刻,process.stdout
对象与process.stderr
对象的写数据操纵才黑白壅塞型操纵。
- 与其他写入流数据的对象差别,
-
argv
: 属性值为一个数组,包含了运转Node.js应用递次时一切敕令行参数。 -
env
: 运转Node.js应用递次的操纵系统的信息 -
config
: 包含了用于编译当前Node.js应用递次的可实行文件的设置选项的JavaScript形貌 -
pid
: 运转当前Node.js应用递次的历程PID -
title
: 运转当前Node.js应用递次敕令行窗口的题目 -
arch
: 运转当前Node.js应用递次的处置惩罚器架构,arm,ia32,x64等
1.2 历程对象的要领
1.2.1 内存运用量memoryUsage()
- 该要领不运用任何参数,返回一个对象,对象所具有的属性以下
-
rss
: 属性值为一个整数,示意运转Node.js应用递次的历程的内存消耗量,单元为字节 -
headTotal
: 属性值为一个整数,示意为V8所分派的内存量,单元为字节 -
headUsed
: 属性值为一个整数,示意V8的内存消耗量,单元为字节
1.2.2 nextTick()
要领
-
process.nextTick(callback)
参数为被推延的函数 - 用于将一个函数推延到代码中所誊写的下一个同步要领实行终了时,或异步要领的事宜回调函数最先实行时挪用。
- 作用与将
setTimeout
要领的事宜参数值指定为0
的作用雷同 - 然则
nextTick()
要领中指定的函数的挪用速率比setTimeout
要领中指定的函数的挪用速率快许多 - 在读取终了文件后挪用
nextTick()
const process = require('process');
const fs = require('fs');
var finish = function () {
console.log('文件读取终了');
}
process.nextTick(finish);
console.log(fs.readFileSync('./fs.js').toString());
- 指定两个耗时操纵同步举行
const process = require('process');
const fs = require('fs');
function foo() {
process.nextTick(Task);
}
function Task() {
var file = fs.createReadStream('./fs.js');
file.on('data', (data) => {
console.log('Task函数中,读取到字节长度:', data.length);
})
}
var file = fs.createReadStream('./fs.js');
file.on('data', (data) => {
console.log('全局中,读取到字节长度:', data.length);
});
foo();
- 在Node.js中,供应了一个
process.maxTickDepth
属性,默许的属性值为1000,当递归深度到达process.maxTickDepth
属性值以后,许可递归函数以外的代码继续实行,然则会发出正告,提示开发者改用setImmediate
要领
1.2.3 process.abort()要领
- 向运转Node.js应用递次的历程发出
SIGABRT
信号,使历程非常停止,同时发生一个中心文件,该要领中不运用任何参数
1.2.4 转变文件目次process.chdir()
- 修正Node.js应用递次中运用的当前事情目次
process.chdir(directory)
- 参数可以为一个字符串,用于指定当前事情目次,该目次可以为一个相对途径,也可以为一个绝对途径。假如指定途径不存在,报错。
1.2.5 返回当前目次process.cwd()
const process = require('process');
console.log('当前目次:' + process.cwd());
process.chdir('../');
console.log('上层目次:' + process.cwd());
1.2.6 退出递次process.exit()
- 退出运转Node.js应用递次的历程
- 运用一个整数值参数,指定为操纵系统供应退出代码,代码为
0
示意一般退出,不运用该参数时的默许参数值为0
1.2.7 设置或返回历程的组ID
-
process.getgid()
返回运转Node.js应用递次的历程的组ID
,该要领只要在非windows操纵系统下有用,不运用任何参数 -
process.setgid(id)
用于设置运转Node.js应用递次的历程的组ID
,该要领只要在非windows操纵系统下有用,不运用任何参数 -
setgid
要领中运用一个参数,参数值可以为一个整数范例的组ID
,也可以为一个字符串范例的组名,假如指定组名,该组名将自动剖析为组ID
1.2.8 设置或返回历程的用户ID
-
process.getuid()
返回运转Node.js应用递次的历程的用户ID,该要领只要在非windows操纵系统下有用,不运用任何参数 -
process.setuid(id)
用于设置运转Node.js应用递次的历程的用户ID,该要领只要在非windows操纵系统下有用
1.2.9 向历程发送信号
-
process.kill(pid, [signal])
用于向历程发送信号 -
pid
参数为必需指定参数,signal
参数为可选参数,pid
参数为一个整数,用于指定须要吸收信号的历程ID
,signal
参数值为一个字符串,用于指定须要发送的信号,比方SIGINT
或SIGUSR1
,当不运用该参数时,默许参数值为SIGTERM
,示意停止该历程
1.2.9 读取或修正历程的文件权限掩码
-
umask([mask])
用于读取或修正运转Node.js应用递次的历程的文件权限掩码。 - 子历程将继续父历程的文件权限掩码
- 参数用于设定修正后的文件权限掩码,假如不运用参数,返回历程当前运用的文件的权限掩码
const process = require('process');
var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('修正前的掩码:', oldmask.toString(8));
console.log('修正后的掩码:', newmask.toString(8));
/****
* 修正前的掩码: 0
* 修正后的掩码: 644
*/
1.2.10 时候
- 返回当前运转时候(秒)
process.uptime()
- 测试一个代码运转时候
process.hrtime()
const process = require('process');
let time = process.hrtime();
for (let i = 0; i < 1000; i++) { }
var endTime = process.hrtime(time);
console.log(endTime);
1.3 历程对象的事宜
1.3.1 退出事宜exit
const process = require('process');
process.on('exit', () => {
console.log('Node.js递次退出');
});
process.exit();
1.3.2 非常事宜uncaughtException
const process = require('process');
process.on('uncaughtException', (err) => {
console.log('捕获到一个非常毛病', err);
});
undefinedFunction();
1.3.3 种种信号事宜
- 当运转Node.js应用递次的历程吸收到种种事宜是,会触发种种信号事宜
- 能够经由过程对这些事宜举行监听并指定事宜回调函数的要领对该信号举行处置惩罚,回调函数不须要任何参数。
1.4 建立多历程应用递次
1.4.1 运用spawn
要领开启子历程
child_process.spawn(command, [args], [options])
-
command
参数值为一个字符串,指定须要运转的敕令 -
args
为一个数组,存放了一切运转该敕令时所须要运用的参数,参数的指定递次与数组中的元素递次保持一致,默许为空 option
参数值为一个对象,用于指定开启子历程时所运用的选项-
cwd
: 指定子历程当前的事情目次 -
stdio
: 设置子历程的规范输入/输出 -
customFds
: 数组,子历程的规范输入/输出指定文件形貌符 -
env
: 为子历程指定环境变量,不指定时,没有能够运用的环境变量 -
detached
: 布尔值,该子历程为一个历程组中的领头历程 -
uid
: 设置子历程的用户ID
-
gid
: 设置子历程的组ID
-
const process = require('process');
const cp = require('child_process');
let sp1 = cp.spawn('node', ['test1.js', 'one', 'two', 'three'], {cwd: './one'})
let sp2 = cp.spawn('node', ['test2.js'], {stdio: 'pipe'});
sp1.stdout.on('data', (data)=>{
console.log('子历程 sp1 标注输出:', data);
sp2.stdin.write(data);
});
sp1.on('exit', (code, signal)=>{
console.log('子历程 sp1 退出,退出代码为', code);
process.exit();
});