2023年7月7日发(作者:)
nodeJS之进程process对象前⾯的话 process对象是⼀个全局对象,在任何地⽅都能访问到它,通过这个对象提供的属性和⽅法,使我们可以对当前运⾏的程序的进程进⾏访问和控制。本⽂将详细介绍process对象
概述 process是⼀个全局对象,即global对象的属性,可以在任何地⽅直接访问到它⽽⽆需引⼊额外模块(process === s);//(process);
属性【】 包含命令⾏参数的数组。第⼀个元素会是'node',第⼆个元素将是.js⽂件的名称,接下来的参数依次是命令⾏参数();//[ 'D:', 'D:' ]【gv】 启动进程所需的 node 命令⾏参数。这些参数不会在 ⾥出现,并且不包含 node 执⾏⽂件的名字,或者任何在名字之后的参数。这些⽤来⽣成⼦进程,使之拥有和⽗进程有相同的参数(gv);【th】 开启当前进程的执⾏⽂件的绝对路径(th);//D:【】 获取当前系统环境信息的对象,常规可以⽤来进⼀步获取环境变量、⽤户名等系统信息/*{ PROCESSOR_ARCHITEW6432: 'AMD64', PROCESSOR_LEVEL: '6', COMMONPROGRAMW6432: 'C:Program FilesCommon Files', PROMPT: '$P$G', PSMODULEPATH: 'C:WINDOWSsystem32WindowsPowerShellv1.0Modules', APPDATA: 'C:UsersAdministratorAppDataRoaming', COMPUTERNAME: 'BAI', COMSPEC: 'C:', FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer', USERPROFILE: 'C:UsersAdministrator', HOMEDRIVE: 'C:', USERNAME: 'Administrator', FP_NO_HOST_CHECK: 'NO', WINDIR: 'C:WINDOWS', PROCESSOR_REVISION: '3c03', FPS_BROWSER_USER_PROFILE_STRING: 'Default', TMP: 'C:UsersADMINI~1AppDataLocalTemp', _DFX_INSTALL_UNSIGNED_DRIVER: '1', PUBLIC: 'C:UsersPublic', 'COMMONPROGRAMFILES(X86)': 'C:Program Files (x86)Common Files', NUMBER_OF_PROCESSORS: '8', SYSTEMROOT: 'C:WINDOWS', TEMP: 'C:UsersADMINI~1AppDataLocalTemp', PROCESSOR_ARCHITECTURE: 'x86', LOCALAPPDATA: 'C:UsersAdministratorAppDataLocal', VISUALSVN_SERVER: 'D:softsvn1', COMMONPROGRAMFILES: 'C:Program Files (x86)Common Files', NODE_PATH: 'D:nodejsnode_modules', ALLUSERSPROFILE: 'C:ProgramData', HOMEPATH: 'UsersAdministrator', USERDOMAIN: 'BAI', WINDOWS_TRACING_LOGFILE: 'C:', PROGRAMFILES: 'C:Program Files (x86)', VBOX_MSI_INSTALL_PATH: 'D:softva', SYSTEMDRIVE: 'C:', PATH: 'C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:Program FilesWIDCOMMBluetooth Software;C:Program FilesWIDCOMMBluetooth Softwa PROGRAMW6432: 'C:Program Files', PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', WINDOWS_TRACING_FLAGS: '3', PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel', USERDOMAIN_ROAMINGPROFILE: 'BAI', LOGONSERVER: 'BAI', PROGRAMDATA: 'C:ProgramData', SESSIONNAME: 'Console', 'PROGRAMFILES(X86)': 'C:Program Files (x86)', OS: 'Windows_NT' } */();(ME);//Administrator【n】 ⼀个暴露编译时存储版本信息的内置变量NODE_VERSION的属性(n);//v6.9.2【ns】 ⼀个暴露存储node以及其依赖包版本信息的属性/*{ http_parser: '2.7.0', node: '6.9.2', v8: '5.1.281.88', uv: '1.9.1', zlib: '1.2.8', ares: '1.10.1-DEV', icu: '57.1', modules: '48', openssl: '1.0.2j' } */(ns);【】 当前进程的 PIDsetInterval(function(){ ();//11204}, 5000);【】 返回当前CPU的架构('arm'、'ia32' 或者 'x64')();//ia32【rm】 运⾏程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' or 'win32'(rm); //win32
⽅法【】 返回当前进程的⼯作⽬录(());//D:project【(directory)】 改变当前⼯作进程的⽬录,如果操作失败抛出异常(());//D:projecttry { ('./dist'); (());//D:projectdist}catch (err) { ('chdir: ' + err);}【Usage()】 返回⼀个对象,它描述了Node进程的内存使⽤情况,其单位是(Usage()); //{ rss: 18894848, heapTotal: 7274496, heapUsed: 3263160 } 【()】 返回 Node 程序已运⾏的秒数(());//0.139var arr = new Array(200000000);var s = (',');(());//0.212【()】 返回当前的⾼分辨时间,形式为 [秒,纳秒] 的元组数组。它是相对于在过去的任意时间。该值与⽇期⽆关,因此不受时钟漂移的影响。主要⽤途是可以通过精确的时间间隔,来衡量程序的性能var t1 = ();var arr = new Array(200000000), s = (',');var t2 = ();//处理数组共花费了0秒,详细为64756416纳秒('处理数组共花费了%d秒,详细为%d纳秒', (t2[0] - t1[0]), (t2[1] - t1[1]));【(pid, [signal])】 结束对应某pid的进程并发送⼀个信号(若没定义信号值则默认为'SIGTERM')();//(, 'SIGTERM');();//''【()】 触发node的abort事件,退出当前进程();('在输出这句话之前就退出了');【([code])】 终⽌当前进程并返回给定的code。如果省略了code,退出时会默认返回成功的状态码('success' code) 也就是(); //[Finished in 0.2s](1); //[Finished in 0.2s with exit code 1] 更多的返回状态码可参考下⽅列表1 未捕获的致命异常(Uncaught Fatal Exception) - There was an uncaught exception, and it was not handled by a domain or an uncaughtException event handler.2 - 未使⽤(Unused) (reserved by Bash for builtin misuse)3 解析错误(Internal JavaScript Parse Error) - The JavaScript source code internal in Node's bootstrapping process caused a parse error. This is extremely rare, and generally can only happen during development of Node itself.4 评估失败(Internal JavaScript Evaluation Failure) - The JavaScript source code internal in Node's bootstrapping process failed to return a function value when evaluated. This is extremely rare, and generally can only happen during development
5 致命错误(Fatal Error) - There was a fatal unrecoverable error in V8. Typically a message will be printed to stderr with the prefix FATAL ERROR.6 未正确的异常处理(Non-function Internal Exception Handler) - There was an uncaught exception, but the internal fatal exception handler function was somehow set to a non-function, and could not be called.7 异常处理函数运⾏时失败(Internal Exception Handler Run-Time Failure) - There was an uncaught exception, and the internal fatal exception handler function itself threw an error while attempting to handle it. This can happen, for example,
8 - 未使⽤(Unused). In previous versions of Node, exit code 8 sometimes indicated an uncaught exception.9 - ⽆效的参数(Invalid Argument) - Either an unknown option was specified, or an option requiring a value was provided without a value.10 运⾏时失败(Internal JavaScript Run-Time Failure) - The JavaScript source code internal in Node's bootstrapping process threw an error when the bootstrapping function was called. This is extremely rare, and generally can only happen during d12 ⽆效的调试参数(Invalid Debug Argument) - The --debug and/or --debug-brk options were set, but an invalid port number was chosen.>128 信号退出(Signal Exits) - If Node receives a fatal signal such as SIGKILL or SIGHUP, then its exit code will be 128 plus the value of the signal code. This is a standard Unix practice, since exit codes are defined to be 7-bit integers, and sign【de】 可以⾃定义退出进程时node shell捕获到的状态码(必须是正常结束进程或者使⽤()指令退出) [注意]如果指明了 (code) 中退出的错误码 (code),则会覆盖掉 de 的设置de = 4;();//[Finished in 0.2s with exit code 4]de = 4;(2);//[Finished in 0.2s with exit code 2]
输⼊输出流【】 ⼀个指向标准输出流(stdout)的可写的流(Writable Stream)/*这是⼀⾏数据这是第⼆⾏数据 */('这是⼀⾏数据n这是第⼆⾏数据');【】 ⼀个指向标准错误流(stderr)的 可写的流(Writable Stream)//输出⼀⾏标准错误流,效果跟stdout没差[Finished in 0.2s]('输出⼀⾏标准错误流,效果跟stdout没差');【】 ⼀个指向标准输⼊流(stdin)的可读流(Readable Stream)。标准输⼊流默认是暂停(pause)的,所以必须要调⽤()来恢复(resume)接收();var a,b;('请输⼊a的值: ');('data',function(data){ if(a == undefined){ a = Number(data); ('请输⼊b的值: '); }else{
b = Number(data); ('结果是: ' + (a+b)); (); }
})
事件【事件'exit'】 当进程将要退出时触发。这是⼀个在固定时间检查模块状态(如单元测试)的好时机。需要注意的是 'exit' 的回调结束后,主事件循环将不再运⾏,所以计时器也会失效/*1退出前执⾏ */('exit', function() { // 设置⼀个延迟执⾏ setTimeout(function() { ('主事件循环已停⽌,所以不会执⾏'); }, 0); ('退出前执⾏');});setTimeout(function() { ('1');}, 500);【事件'uncaughtException'】 捕获那些没有try catch的异常错误//捕获到⼀个异常('uncaughtException', function() { ('捕获到⼀个异常');});var a = '123';a.a(); //触发异常事件('这句话不会显⽰出来');【事件'SIGINT'】 捕获当前进程接收到的信号(如按下了 ctrl + c)('SIGINT', function() { ('收到 SIGINT 信号。');});('试着按下 ctrl + C');setTimeout(function() { ('end');}, 50000);
nextTick【ck(callback)】 该⽅法算是 process 对象最重要的⼀个属性⽅法了,表⽰在事件循环(EventLoop)的下⼀次循环中调⽤ callback 回调函数。这不是 setTimeout(fn, 0) 函数的⼀个简单别名,因为它的效率⾼多了。该函数能在任何 I/O 事前之前调⽤回调函数。如果想要在对象创建之后⽽I/O操作发⽣之前执⾏某些操作,那么这个函数就⼗分重要了 是单线程的,除了系统IO之外,在它的事件轮询过程中,同⼀时间只会处理⼀个事件。可以把事件轮询想象成⼀个⼤的队列,在每个时间点上,系统只会处理⼀个事件。即使电脑有多个CPU核⼼,也⽆法同时并⾏的处理多个事件。但也就是这种特性使得适合处理I/O型的应⽤。在每个I/O型的应⽤中,只需要给每⼀个输⼊输出定义⼀个回调函数即可,他们会⾃动加⼊到事件轮询的处理队列⾥。当I/O操作完成后,这个回调函数会被触发。然后系统会继续处理其他的请求 在这种处理模式下,ck()的意思就是定义出⼀个动作,并且让这个动作在下⼀个事件轮询的时间点上执⾏function foo() { ('foo');}
ck(foo);('bar');/*barfoo*/ 也可以使⽤setTimeout()函数来达到貌似同样的执⾏效果setTimeout(foo, 0);('bar'); 但在内部的处理机制上,ck()和setTimeout(fn, 0)是不同的,ck()不是⼀个单纯的延时,它有更多的特性。更精确的说,ck()定义的调⽤会创建⼀个新的⼦堆栈。在当前的栈⾥,可以执⾏任意多的操作。但⼀旦调⽤nextTick,函数就必须返回到⽗堆栈。然后事件轮询机制⼜重新等待处理新的事件,如果发现nextTick的调⽤,就会创建⼀个新的栈。 在下⾯的例⼦⾥有⼀个compute(),我们希望这个函数尽可能持续的执⾏,来进⾏⼀些运算密集的任务。但与此同时,我们还希望系统不要被这个函数堵塞住,还需要能响应处理别的事件。这个应⽤模式就像⼀个单线程的web服务server。在这⾥我们就可以使⽤ck()来交叉执⾏compute()和正常的事件响应var http = require('http');function compute() { // performs complicated calculations continuously ck(compute);}Server(function(req, res) { ead(200, {'Content-Type': 'text/plain'}); ('Hello World');}).listen(5000, '127.0.0.1');compute(); 在这种模式下,我们不需要递归的调⽤compute(),只需要在事件循环中使⽤ck()定义compute()在下⼀个时间点执⾏即可。在这个过程中,如果有新的http请求进来,事件循环机制会先处理新的请求,然后再调⽤compute()。反之,如果把compute()放在⼀个递归调⽤⾥,那系统就会⼀直阻塞在compute()⾥,⽆法处理新的http请求了 当然,我们⽆法通过ck()来获得多CPU下并⾏执⾏的真正好处,这只是模拟同⼀个应⽤在CPU上分段执⾏⽽已【总结】 Nodejs的特点是事件驱动,异步I/O产⽣的⾼并发,产⽣此特点的引擎是事件循环,事件被分门别类地归到对应的事件观察者上,⽐如idle观察者,定时器观察者,I/O观察者等等,事件循环每次循环称为Tick,每次Tick按照先后顺序从事件观察者中取出事件进⾏处理 调⽤setTimeout()或setInterval()时创建的计时器会被放⼊定时器观察者内部的红⿊树中,每次Tick时,会从该红⿊树中检查定时器是否超过定时时间,超过的话,就⽴即执⾏对应的回调函数。setTimeout()和setInterval()都是当定时器使⽤,他们的区别在于后者是重复触发,⽽且由于时间设的过短会造成前⼀次触发后的处理刚完成后⼀次就紧接着触发 由于定时器是超时触发,这会导致触发精确度降低,⽐如⽤setTimeout设定的超时时间是5秒,当事件循环在第4秒循到了⼀个任务,它的执⾏时间3秒的话,那么setTimeout的回调函数就会过期2秒执⾏,这就是造成精度降低的原因。并且由于采⽤红⿊树和迭代的⽅式保存定时器和判断触发,较为浪费性能 使⽤ck()所设置的所有回调函数都会放置在数组中,会在下⼀次Tick时所有的都⽴即被执⾏,该操作较为轻量,时间精度⾼ setImmediate()设置的回调函数也是在下⼀次Tick时被调⽤,其和ck()的区别在于两点: 1、所属的观察者被执⾏的优先级不⼀样,ck()属于idle观察者,setImmediate()属于check观察者,idle的优先级>check 2、setImmediate()设置的回调函数是放置在⼀个链表中,每次Tick只执⾏链表中的⼀个回调。这是为了保证每次Tick都能快速地被执⾏
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688682635a162157.html
评论列表(0条)