您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Node.js是不是單線程嗎”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Node.js是不是單線程嗎”這篇文章吧。
在操作系統中,對進程的解釋:進程是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。
是應用程序的一次運行過程(動態概念)
是系統分配和調度資源的基本單位(進程是一般由程序、數據集合和進程控制塊三部分組成)
每個進程有自己獨立的空間地址,數據棧(各進程間數據不共享,可通過其他方式進行通信)進程一般有初始態,執行態,等待狀態,就緒狀態,終止狀態五種狀態
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。
任務調度和執行的最小單位
一個進程中代碼單一執行路線
線程是程序執行的最小單位,進程是操作系統分配資源的最小單位一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線進程間相互獨立,但同一進程下各線程之間共享程序的內存空間線程上下文切換比進程上下文切換要快
node是單線程的,即一個進程只開一個線程node。【推薦學習:《nodejs 教程》】
真的單線程嗎?
Node 雖然是單線程,但是其底層是多線程的。事件循環中,libuv庫從事件隊列中取出任務再分配給不同的線程進行處理。現在硬件條件沒有以前那么落后,如果只使用單線程進行操作,則會浪費資源。所以,為了實現多進程處理,充分發揮多核CPU的優勢,Node中提供了child_process模塊和cluster模塊。
child_process模塊用于開啟多個子進程,子進程中運行不同的命令或執行node.js模塊文件、可執行文件
Cluster模塊,集群模塊,用于實現在Node.js應用程序中開啟多個子進程,每個子進程中運行一個Node.js應用程序副本的處理
child_process.spawn():適用于返回大量數據,例如圖像處理,二進制數據處理。
child_process.exec():適用于小量數據,maxBuffer 默認值為 200 * 1024 超出這個默認值將會導致程序崩潰,數據量過大可采用 spawn。
child_process.execFile():類似 child_process.exec(),區別是不能通過 shell 來執行,不支持像 I/O 重定向和文件查找這樣的行為
child_process.fork(): 衍生新的進程,進程之間是相互獨立的,每個進程都有自己的 V8 實例、內存,系統資源是有限的,不建議衍生太多的子進程出來,通常根據系統* CPU 核心數設置。
cluster.fork([env]) 開啟子進程,子進程中創建一個Node.js應用程序的實例
isMaster屬性和isWorker屬性用于判斷是運行在主進程中,還是運行在子進程中
Workers屬性用于獲取所有子進程中運行的worker對象
擴展一下,多線程之間如何通信?
四種:
消息傳遞(管道、FIFO、消息隊列)
信號量(互斥量、條件變量、讀寫鎖)
共享內存(匿名、命名)
遠程過程調用
進程間的通信不僅在node中會遇到,其實在其他語言都會遇到的,當然在面試中也是必提問的問題吧。
以上是“Node.js是不是單線程嗎”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。