2017-11-07 4 views
1

私は私のノードサーバのスレッドを列挙し、次は、標準出力に対応しました:ノードが複数のスレッドを生成するのはなぜですか?

$ ps -e -T | grep 14209 
14209 14209 ?  00:10:08 node 
14209 14415 ?  00:00:00 V8 WorkerThread 
14209 14416 ?  00:00:00 V8 WorkerThread 
14209 14417 ?  00:00:00 V8 WorkerThread 
14209 14418 ?  00:00:00 V8 WorkerThread 
14209 14419 ?  00:00:00 node 
14209 15894 ?  00:00:00 node 
14209 15895 ?  00:00:00 node 
14209 15896 ?  00:00:00 node 
14209 15902 ?  00:00:00 node 

私はnodejsがシングルスレッドであり、同じスレッドはjavascriptのコードを処理するための責任があることを学びました。だから、最後の5つのスレッドの目的は何ですか?非同期I/Oを扱うlibuvによって生成されますか?

答えて

0

最後の5つのスレッドの目的は何ですか?非同期I/Oを扱うlibuvによって生成されますか?

少なくとも一部は(すべてではないにしても)libuvであるため、はいです。

libuvは、ユーザーコードを実行するために使用することができ、通知を受けるスレッドプールを提供しています。
ライブラリがさえないだけで彼らのためにも、FSの要求のために主に使用するスレッドプールを(それが明示的documentationで述べています)がありますループスレッド内にある。このスレッドプールは、getaddrinfoおよびgetnameinfo要求だけでなく、すべてのファイルシステム操作を実行するために内部的に使用されます。

これは、fs要求などが本質的に同期しているためで、非同期に見えるようにする唯一の方法は、別のスレッドで要求を生成してから、その応答をメインスレッドで処理することです。

JavaScript環境がシングルスレッドであることは間違いありませんが、基礎となるライブラリ(主にv8libuv)は、目的に合わせて内部的にスレッドを使用しません。 JavaScriptランタイムがシングルスレッドとしてユーザーに表示される限り、スレッドを使用しない理由はありません。
実際には、これらのライブラリは、タスクを実行してパフォーマンスを向上させるために、ある程度はスレッドを生成し、内部的に使用するものです。

関連する問題