簡體   English   中英

了解node.js中的事件循環

[英]Understanding the Event-Loop in node.js

我已經閱讀了很多有關事件循環的文章,並且我理解了提供的抽象,通過該抽象,我可以發出I / O請求(讓我們使用fs.readFile(foo.txt)),然后傳遞一次將執行一次的回調會觸發一個指示文件讀取完成的特定事件。

但是,我不了解的是正在執行實際讀取文件的功能的位置。 Javascript是單線程的,但是同時發生了兩件事:我的node.js文件的執行以及實際上從硬盤驅動器讀取數據的某些程序/函數的執行。 第二個功能相對於節點在哪里發生?

Node事件循環實際上是單線程的。 當我們使用Node啟動程序時,將創建事件循環的單個實例並將其放入一個線程中。

但是,對於某些標准庫函數調用,節點C ++端和libuv決定完全在事件循環之外進行昂貴的計算。 因此它們不會阻塞主循環或事件循環。 相反,它們使用一種稱為線程池的東西,該線程池是一系列(默認情況下)四個線程,可以用於運行計算密集型任務。 使用線程池的只有四件事-DNS查找,fs,crypto和zlib。 其他所有內容都在主線程中執行。

“當然,在后端,有一些線程和進程用於數據庫訪問和進程執行。但是,這些線程和進程沒有顯式地暴露給您的代碼,因此,除了知道I / O交互(例如與從每個請求的角度來看,數據庫或其他進程將是異步的,因為這些線程的結果是通過事件循環返回到您的代碼的,與Apache模型相比,線程和線程開銷要少得多,因為線程並不需要每個連接;只是當您絕對肯定必須並行運行其他東西,甚至管理工作由Node.js處理時。” 通過http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

就像使用setTimeout(function(){/*file reading code here*/},1000); JavaScript可以並行運行多個事物,例如,具有三個setInterval(function(){/*code to execute*/},1000); 因此,JavaScript在某種程度上是多線程的。 如果要使用NodeJS在硬盤中實際讀取/寫入硬盤,請使用:

var child=require("child_process");
function put_text(file,text){
  child.exec("echo "+text+">"+file);
}
function get_text(file){
//JQuery code for getting file contents here (i think)
return JQueryResults;
}

這些還可以用於使用NodeJS在硬盤上進行讀寫操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM