亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候使用線程池?

什么時候使用線程池?

忽然笑 2019-10-14 14:20:42
因此,我對Node.js的工作方式有所了解:它具有一個偵聽器線程,該線程接收事件,然后將其委托給工作池。工作線程在完成工作后會通知偵聽器,然后偵聽器將響應返回給調用者。我的問題是:如果我在Node.js中建立一個HTTP服務器,并在我的一個路由路徑事件(例如“ / test / sleep”)中調用sleep,則整個系統將停止。甚至是單個偵聽器線程。但是我的理解是這段代碼正在工作池中發生?,F在,相比之下,當我使用Mongoose與MongoDB交談時,數據庫讀取是一項昂貴的I / O操作。Node似乎能夠將工作委托給線程并在完成時接收回調。從數據庫加載所需的時間似乎不會阻塞系統。Node.js如何決定使用線程池線程還是偵聽器線程?為什么我不能編寫僅休眠和阻塞線程池線程的事件代碼?
查看完整描述

3 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

您對節點如何工作的理解是不正確的……但這是一個常見的誤解,因為這種情況的實際情況實際上相當復雜,并且通常歸結為諸如“ node is single threaded”之類的小詞,過分簡化了事情。

目前,我們將忽略通過集群和webworker-threads進行的顯式多處理/多線程,而僅討論典型的非線程節點。

節點在單個事件循環中運行。它是單線程的,您只能獲得一個線程。您編寫的所有JavaScript都會在此循環中執行,并且如果該代碼中發生了阻塞操作,則它將阻塞整個循環,直到完成為止,否則將什么也不會發生。這是您經常聽到的節點的典型單線程性質。但是,這還不是全部。

通常使用C / C ++編寫的某些功能和模塊支持異步I / O。當您調用這些函數和方法時,它們在內部管理將調用傳遞給工作線程。例如,當您使用該fs模塊請求文件時,該fs模塊將該調用傳遞給工作線程,該工作線程等待其響應,然后將其呈現回事件循環,該循環在沒有它的情況下一直在進行與此同時。所有這些都是從您(節點開發人員)那里抽象出來的,其中一些是通過使用libuv從模塊開發商那里抽象出來的。

正如Denis Dollfus在評論中指出的(從此答案到類似的問題),libuv用于實現異步I / O的策略并不總是線程池,特別是在http模塊的情況下,似乎是另一種策略目前使用。對于我們這里的目的,最重要的是要注意如何實現異步上下文(通過使用libuv),并且libuv維護的線程池是該庫提供的實現異步的多種策略之一。


在一篇非常相關的切線上,這篇出色的文章對節點如何實現異步性以及一些相關的潛在問題以及如何處理這些問題進行了更深入的分析。它的大部分內容是在我上面寫的內容基礎上擴展的,但是另外指出:

  • 您包含在項目中的任何使用本機C ++和libuv的外部模塊都可能使用線程池(請考慮:數據庫訪問)

  • libuv的默認線程池大小為4,并使用隊列來管理對線程池的訪問-結果是,如果您同時有5個長時間運行的數據庫查詢都在運行,則其中一個(以及任何其他異步查詢)依賴于線程池的操作)將等待查詢結束,甚至無法開始

  • 您可以通過UV_THREADPOOL_SIZE環境變量增加線程池的大小來緩解這種情況,只要您在需要并創建線程池之前就這樣做即可:process.env.UV_THREADPOOL_SIZE = 10;


如果要在節點中使用傳統的多處理或多線程,則可以通過內置cluster模塊或上述其他各種模塊來獲取webworker-threads,也可以通過實現某種方式將工作分塊并手動使用setTimeout或進行偽造setImmediateprocess.nextTick暫停您的工作并在以后的循環中繼續進行,以完成其他過程(但不建議這樣做)。

請注意,如果您使用javascript編寫長時間運行/阻止的代碼,則可能是在犯錯誤。其他語言將更有效地執行。


查看完整回答
反對 回復 2019-10-14
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

這種誤解僅僅是搶先式多任務處理與協作式多任務處理之間的區別...

睡眠會關閉整個狂歡節,因為所有游樂設施實際上只有一條路線,而您關上了大門。將其視為“ JS解釋器和其他一些東西”,而忽略線程...對于您來說,只有一個線程,...

...所以不要阻止它。


查看完整回答
反對 回復 2019-10-14
  • 3 回答
  • 0 關注
  • 1223 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號