2016-08-16 6 views
0

非同期関数で実際に何が起こっていますか?非同期メソッドとスレッドについて

新しいスレッドを開き、OSを起動して実行させますか?

もしそうなら、デッドロックやその他のスレッドの問題を引き起こす可能性がありますか?

ここでは非同期メソッドの例です:fs.readFile(file,callback) .Thisで

var fs = require('fs') 
var file = process.argv[2] 

fs.readFile(file, function (err, contents) { 
    var lines = contents.toString().split('\n').length - 1 
    console.log(lines) 
}) 

答えて

1

は意味非ブロッキング呼び出しです。

  1. ノードのメインスレッドは、イベントテーブル及びファイル 読み出し処理が行われるたびに放出されるイベントに 関連付けるそれをcallbackを記憶します。
  2. 同じ時刻にノードには、 からいくつかの内部スレッド(スレッドプール)があり、ノードのメインスレッドは、ファイル読み取りタスクを スレッドの1つに割り当てます。
  3. この割り当ての後、コマンドはメインスレッドに返され、 メインスレッドは他のタスクを続行し、ファイル読み取りプロセス は他のスレッド(メインスレッドではない)によってバックグラウンドで実行されています。ファイル読み出し処理が callbackに関連付けられたイベントを完了するたびに
  4. は、ファイルからのデータと一緒に放出され、イベントループは、メインスレッド(スタック)に に各タスクをプッシュしようとする場合、その コールバックはtask-queueに押し込まれます。
  5. callbackのタスクの前にメインスレッド(スタック)が使用可能になり、 タスクが存在しない場合、このコールバックはイベントループによって メインスレッドのスタックにプッシュされます。

詳しくはevent-loopをお読みください。

したがって、ファイルの読み込みを担当するスレッドは、スレッドにはデッドロックを引き起こしません。 これは単に例外または成功を出力します。これは後でcallbackに送信されます

+0

ノードの非同期機能を使用するときにスレッドの問題について心配する必要はありませんか? – shinzou

+0

はい。 あなたはそうする必要はありません。発生した例外はコールバックによって処理されるためです。 – vkstack

関連する問題