簡體   English   中英

為什么 Node.js 每個進程旋轉 7 個線程

[英]Why Node.js spins 7 threads per process

當 Node.js 進程啟動時,top 命令顯示附加到該進程的 7 個線程。 所有這些線程在做什么? 此外,隨着 API 上的負載增加,請求處理程序本身異步等待其他上游 API 調用是否會產生額外的工作線程? 我在上面看到它是這樣做的。 但我認為這只發生在文件 I/o 上。 為什么它需要這些額外的工作線程?

LIBUV(node.js 構建的底層跨平台系統庫)使用線程池進行某些操作,例如磁盤 I/O 和一些加密操作。 默認情況下,線程池包含 4 個線程。

另外,還有一個線程用於執行您的 Javascript,因此占 5。

然后,垃圾收集器似乎使用了一個線程來對對象進行背景標記(根據V8 開發人員的這個參考)和這篇文章 那將是6。

我不知道第七個會是什么。 事件循環本身可能使用了一個線程。

然后,從 2018 年左右開始,nodejs 似乎切換到一組單獨的線程用於 DNS 請求(與文件 I/O 線程池分開)。 這可能是因為 node.js 中的問題,其中 4 個慢速 DNS 請求可能會阻塞所有文件 I/O,因為它們接管了線程池。 所以,現在看起來 node.js 使用了 DNS 的C-ARES 庫,它創建了自己的線程集。

僅供參考,您實際上可以使用UV_THREADPOOL_SIZE環境變量控制線程池大小。


而且,當然,您可以創建自己的工作線程來實際創建 V8 Javascript 執行引擎的新實例(因此它們最終可能會創建多個新線程)。

暫無
暫無

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

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