2016-05-21 20 views
1

node.jsのlibuvスレッドプールの詳細については、次のnode.jsプログラム(Ubuntu 14.04のノードバージョン6.2.0)を書きました。プログラムでは、サイズ10KBの2つのテキストファイルを読んでいます。ファイルが正常に読み込まれた後、私はいくつかのコンピューティング集中的な仕事をしています(コールバックで)。node.jsのlibuvスレッドプールについての私の理解は正しいですか?

var log4js = require('log4js');// For logging output with timestamp 
var logger = log4js.getLogger(); 

var fs=require('fs'); 

fs.readFile('testFile0.txt',function(err,data){//read testFile0.txt 
logger.debug('data read of testFile0.txt'); 

for(var i=0; i<10000; i++)//Computing intensive task. Looping for 10^10 times 
{ 
    for(var j=0; j<10000; j++) 
    { 
     for(var k=0; k<100; k++) 
     { 

     } 
    } 
} 
}); 

fs.readFile('testFile1.txt',function(err,data){//read testFile1.txt 
logger.debug('data read of testFile1.txt'); 

for(var i=0; i<10000; i++)//Computing intensive task. Looping for 10^10 times 
{ 
    for(var j=0; j<10000; j++) 
    { 
     for(var k=0; k<100; k++) 
     { 

     } 
    } 
} 
}); 

libuvのスレッドプールの私の理解あたりに、2つのファイルがすぐに読まれるべきであるとし、書類の印刷との間の時間差「testFile0.txtの読み込んだデータ」、「testFile1.txtのデータの読み取り」でなければなりません既定のスレッドプールサイズが4であり、2つの非同期要求(ファイル読み取り操作)しか存在しないため、非常に少ない(ミリ秒または最大でも)。しかし、 "testFile0.txtのデータ読み取り"と "testFile0.txtのデータ読み取り"という文の印刷の時間差はかなり大きい(10秒)。誰かがなぜ時間差がそれほど大きいのか説明できますか?コールバックで実行されるコンピューティング集中型タスクは大きな時間差に貢献しますか?

答えて

2

libuvには、サイズが4のスレッドプール(デフォルト)があり、その部分が正しいようになっています。さて、実際にどのように使用されているか見てみましょう。

いくつかの操作がスレッドプール内でキューに入れられると、そのスレッドの1つで実行され、その結果がループが実行されているスレッドである「メイン」スレッドに送信されます。結果はFIFO形式で処理されます。

あなたの場合、ファイルの読み込みは並行して行われますが、結果の処理はシリアル化されます。つまり、ディスクからバイトを並行して読み込みながら、コールバックは常に次々に実行されます。

2番目のコールバックは最初のコールバックが終了した後にしか実行できないため、遅延がありますが、その遅延は〜10秒かかるため遅延が発生します。

このトランプを並列化する1つの方法は、スレッドプール自体で計算を行うことですが、uv_queue_workを使用するアドオンが必要ですが、child_process mdouleを使用してください。

関連する問題