process对象是一个全局对象,在任何地方都能访问到它,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制。本文将详细介绍process对象
process是一个全局对象,即global对象的属性,可以在任何地方直接访问到它而无需引入额外模块
1 |
|
1 |
|
【process.argv】
包含命令行参数的数组。第一个元素会是'node',第二个元素将是.js文件的名称,接下来的参数依次是命令行参数
1 |
|
【process.execArgv】
启动进程所需的 node 命令行参数。这些参数不会在 process.argv 里出现,并且不包含 node 执行文件的名字,或者任何在名字之后的参数。这些用来生成子进程,使之拥有和父进程有相同的参数
1 |
|
【process.execPath】
开启当前进程的执行文件的绝对路径
1 |
|
【process.env】
获取当前系统环境信息的对象,常规可以用来进一步获取环境变量、用户名等系统信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
1 |
|
【process.version】
一个暴露编译时存储版本信息的内置变量NODE_VERSION的属性
1 |
|
【process.versions】
一个暴露存储node以及其依赖包版本信息的属性
1 2 3 4 5 6 7 8 9 |
|
【process.pid】
当前进程的 PID
1 2 |
|
【process.arch】
返回当前CPU的架构('arm'、'ia32' 或者 'x64')
1 |
|
【process.platform】
运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' or 'win32'
1 |
|
【process.cwd】
返回当前进程的工作目录
1 |
|
【process.chdir(directory)】
改变当前工作进程的目录,如果操作失败抛出异常
1 2 3 4 5 |
|
【process.memoryUsage()】
返回一个对象,它描述了Node进程的内存使用情况,其单位是bytes
1 |
|
【process.uptime()】
返回 Node 程序已运行的秒数
1 2 |
|
【process.hrtime()】
返回当前的高分辨时间,形式为 [秒,纳秒] 的元组数组。它是相对于在过去的任意时间。该值与日期无关,因此不受时钟漂移的影响。主要用途是可以通过精确的时间间隔,来衡量程序的性能
1 2 |
|
【process.kill(pid, [signal])】
结束对应某pid的进程并发送一个信号(若没定义信号值则默认为'SIGTERM')
1 2 |
|
【process.abort()】
触发node的abort事件,退出当前进程
1 2 |
|
【process.exit([code])】
终止当前进程并返回给定的code。如果省略了code,退出时会默认返回成功的状态码('success' code) 也就是0
1 |
|
1 |
|
更多的返回状态码可参考下方列表
1 2 3 4 |
|
【process.exitCode】
可以自定义退出进程时node shell捕获到的状态码(必须是正常结束进程或者使用process.exit()指令退出)
[注意]如果指明了 process.exit(code) 中退出的错误码 (code),则会覆盖掉 process.exitCode 的设置
1 2 |
|
1 2 |
|
【process.stdout】
一个指向标准输出流(stdout)的可写的流(Writable Stream)
1 2 |
|
【process.stderr】
一个指向标准错误流(stderr)的 可写的流(Writable Stream)
1 |
|
【process.stdin】
一个指向标准输入流(stdin)的可读流(Readable Stream)。标准输入流默认是暂停(pause)的,所以必须要调用process.stdin.resume()来恢复(resume)接收
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
【事件'exit'】
当进程将要退出时触发。这是一个在固定时间检查模块状态(如单元测试)的好时机。需要注意的是 'exit' 的回调结束后,主事件循环将不再运行,所以计时器也会失效
1 2 3 4 5 6 7 8 9 |
|
【事件'uncaughtException'】
捕获那些没有try catch的异常错误
1 2 3 4 |
|
【事件'SIGINT'】
捕获当前进程接收到的信号(如按下了 ctrl + c)
1 2 3 4 5 6 7 |
|
【process.nextTick(callback)】
该方法算是 process 对象最重要的一个属性方法了,表示在事件循环(EventLoop)的下一次循环中调用 callback 回调函数。这不是 setTimeout(fn, 0) 函数的一个简单别名,因为它的效率高多了。该函数能在任何 I/O 事前之前调用回调函数。如果想要在对象创建之后而I/O操作发生之前执行某些操作,那么这个函数就十分重要了
Node.js是单线程的,除了系统IO之外,在它的事件轮询过程中,同一时间只会处理一个事件。可以把事件轮询想象成一个大的队列,在每个时间点上,系统只会处理一个事件。即使电脑有多个CPU核心,也无法同时并行的处理多个事件。但也就是这种特性使得node.js适合处理I/O型的应用。在每个I/O型的应用中,只需要给每一个输入输出定义一个回调函数即可,他们会自动加入到事件轮询的处理队列里。当I/O操作完成后,这个回调函数会被触发。然后系统会继续处理其他的请求
在这种处理模式下,process.nextTick()的意思就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行
1 2 3 4 5 6 7 |
|
也可以使用setTimeout()函数来达到貌似同样的执行效果
1 2 |
|
但在内部的处理机制上,process.nextTick()和setTimeout(fn, 0)是不同的,process.nextTick()不是一个单纯的延时,它有更多的特性。更精确的说,process.nextTick()定义的调用会创建一个新的子堆栈。在当前的栈里,可以执行任意多的操作。但一旦调用nextTick,函数就必须返回到父堆栈。然后事件轮询机制又重新等待处理新的事件,如果发现nextTick的调用,就会创建一个新的栈。
在下面的例子里有一个compute(),我们希望这个函数尽可能持续的执行,来进行一些运算密集的任务。但与此同时,我们还希望系统不要被这个函数堵塞住,还需要能响应处理别的事件。这个应用模式就像一个单线程的web服务server。在这里我们就可以使用process.nextTick()来交叉执行compute()和正常的事件响应
1 2 3 4 5 6 7 8 |
|
このモードでは、compute() を再帰的に呼び出す必要はなく、イベント ループで process.nextTick() を使用して、次の時点で実行される compute() を定義するだけで済みます。このプロセス中に、新しい http リクエストが受信されると、イベント ループ メカニズムは最初に新しいリクエストを処理し、次に compute() を呼び出します。逆に、再帰呼び出しに compute() を入れると、システムは常に compute() でブロックされ、新しい http リクエストを処理できなくなります
もちろん、process.nextTick() を通じてマルチ CPU 処理を取得することはできません。並列実行の本当の利点は、CPU 上で同じアプリケーションのセグメント化された実行をシミュレートするだけであるということです
[概要]
Nodejs は、非同期 I/O によって生成されるイベント駆動型の高い同時実行性を特徴とするこの機能を生成するエンジンです。はイベント ループであり、イベントはアイドル オブザーバー、タイマー オブザーバー、I/O オブザーバーなどの対応するイベント オブザーバーに分類されます。イベント ループの各サイクルは Tick と呼ばれ、各 Tick はイベントから順番に監視されます。 setTimeout() または setInterval() を呼び出したときに作成されたタイマーは、タイマー オブザーバー内の赤黒ツリーに配置され、タイマーがタイマーを超えているかどうかが赤黒ツリーからチェックされます。したがって、対応するコールバック関数がすぐに実行されます。 setTimeout() と setInterval() の違いは、後者は繰り返しトリガーされることと、時間が短すぎるため、前のトリガー後の処理が完了した直後にトリガーされることです
タイマーはタイムアウトによってトリガーされるため、トリガーの精度が低下します。たとえば、setTimeout で設定されたタイムアウトが 4 秒目にタスクをループし、その実行時間が 3 秒の場合、 setTimeout コールバック この関数は 2 秒で期限切れになるため、精度が低下します。そして、タイマーと判定トリガーを節約するために赤黒ツリーと反復を使用するため、パフォーマンスの無駄になります
process.nextTick() を使用して設定されたすべてのコールバック関数は配列に配置され、すべてがすぐに呼び出されます次のTick.Executionでは、この操作は比較的軽量で時間精度が高いです
次のTickでもsetImmediate()で設定されたコールバック関数が呼び出されます。 process.nextTick()との違いは次の2点です。
1. 関連付けられたオブザーバーが呼ばれる 実行優先度が異なります。 process.nextTick() はアイドルオブザーバーに属し、 setImmediate() はアイドルオブザーバーに属します。 2. コールバック関数のセット。 setImmediate() によって、リンク リストに配置され、各 Tick はリンク リスト内の 1 つのコールバックのみを実行します。これは、各ティックを迅速に実行できるようにするためです
以上がnodeJSのプロセスオブジェクトの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。