在Node.js中,只支持单线程。可是在应用程序中,若是只使用单线程进行操做,从接收请求开始到返回响应为止的这段时间内可能存在很长的一段等待时间。在这种场合下,若是可以使用多进程,则能够为每一个请求分配一个进程,从而能够更好地使用服务器端的CPU资源。为了实现多线程处理,Node.js中提供了child_process
模块与cluster
模块,其中的child_process
模块用于实如今Node.js应用程序中开启多个子进程,并在各个子进程中运行各类不一样的命令或执行Node.js模块文件,可执行文件的处理,cluster
模块用于实如今Node.js应用程序中开启多个子进程,在每一个子进程中运行一个Node.js应用程序副本的处理。
process.execPath
: 用于运行应用程序的可执行文件的绝对路径version
: Node.js的版本号versions
: Node.js及其各依赖的版本号platform
: 当前运行Node.js的平台stdin
: 用于读入标准输入流的对象。默认状况下,标准输入流处于暂停状态,好比恢复读取标准输入流process.stdin.resume()
stdout
: 用于写入标准输出流的对象stderr
: 用于写入标准错误输出流的对象javascript
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应用程序的进程PIDtitle
: 运行当前Node.js应用程序命令行窗口的标题arch
: 运行当前Node.js应用程序的处理器架构,arm,ia32,x64等memoryUsage()
rss
: 属性值为一个整数,表示运行Node.js应用程序的进程的内存消耗量,单位为字节headTotal
: 属性值为一个整数,表示为V8所分配的内存量,单位为字节headUsed
: 属性值为一个整数,表示V8的内存消耗量,单位为字节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();
process.maxTickDepth
属性,默认的属性值为1000,当递归深度达到process.maxTickDepth
属性值以后,容许递归函数以外的代码继续执行,可是会发出警告,提醒开发者改用setImmediate
方法process.abort()方法
SIGABRT
信号,使进程异常终止,同时产生一个核心文件,该方法中不使用任何参数process.chdir()
process.chdir(directory)
process.cwd()
const process = require('process'); console.log('当前目录:' + process.cwd()); process.chdir('../'); console.log('上层目录:' + process.cwd());
process.exit()
0
表示正常退出,不使用该参数时的默认参数值为0
ID
process.getgid()
返回运行Node.js应用程序的进程的组ID
,该方法只有在非windows操做系统下有效,不使用任何参数process.setgid(id)
用于设置运行Node.js应用程序的进程的组ID
,该方法只有在非windows操做系统下有效,不使用任何参数setgid
方法中使用一个参数,参数值能够为一个整数类型的组ID
,也能够为一个字符串类型的组名,若是指定组名,该组名将自动解析为组ID
ID
process.getuid()
返回运行Node.js应用程序的进程的用户ID,该方法只有在非windows操做系统下有效,不使用任何参数process.setuid(id)
用于设置运行Node.js应用程序的进程的用户ID,该方法只有在非windows操做系统下有效process.kill(pid, [signal])
用于向进程发送信号pid
参数为必须指定参数,signal
参数为可选参数,pid
参数为一个整数,用于指定须要接收信号的进程ID
,signal
参数值为一个字符串,用于指定须要发送的信号,例如SIGINT
或SIGUSR1
,当不使用该参数时,默认参数值为SIGTERM
,表示终止该进程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 */
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);
exit
const process = require('process'); process.on('exit', () => { console.log('Node.js程序退出'); }); process.exit();
uncaughtException
const process = require('process'); process.on('uncaughtException', (err) => { console.log('捕获到一个异常错误', err); }); undefinedFunction();
spawn
方法开启子进程child_process.spawn(command, [args], [options])
command
参数值为一个字符串,指定须要运行的命令args
为一个数组,存放了全部运行该命令时所须要使用的参数,参数的指定顺序与数组中的元素顺序保持一致,默认为空option
参数值为一个对象,用于指定开启子进程时所使用的选项java
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(); });