2016-08-16 59 views
0

使用異步函數的幕後實際發生了什麼?關於異步方法和線程

它是否打開一個新線程並讓操作系統啓動並運行它?

如果是這樣,是否會導致死鎖或其他線程問題?

這裏的一個異步方法的一個示例:

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

fs.readFile(file,callback)。這是一個非阻塞調用,這意味着。

  1. 節點的主線程專賣店在事件表中的callback和 它只要文件 閱讀過程完成後,這將發出一個事件相關聯。
  2. 同時節點有幾個內部線程(線程池) 哪個節點的主線程將文件讀取任務分配給 線程中的一個。
  3. 在這個賦值之後,該命令返回到主線程並且 主線程繼續執行其他任務並且文件讀取進程 由其他線程(不是主線程)在後臺完成。
  4. 每當文件讀出處理完成後用 的callback相關聯的事件與從文件中的數據發射的沿,並且其中事件循環嘗試將每個任務推 到主線程(堆),該 回調被推入task-queue
  5. 並且當主線程(堆棧)變爲可用並且沒有 任務存在於callback的任務之前時,此回調將通過事件循環推送到 主線程的堆棧。

有關更多信息,請參閱event-loop

所以負責文件讀取的線程不會導致死鎖到其他線程。 它只是發出異常或成功,這是後來由callback

+0

處理所以我們不必擔心使用節點的異步功能時的線程問題? – shinzou

+0

是的。 您不必這樣做。因爲發生的任何異常都將由回調處理。 – vkstack