Node中libuv的I O執行緒池與PHP之類建立的執行緒有啥區別?

時間 2021-06-02 14:03:00

1樓:碼農投資筆記

IO分為磁碟IO與網路IO,磁碟IO確實得由libuv執行緒池中的執行緒去阻塞執行,但是網路IO就不用了,網路IO這一塊linux底層是epoll,windows是IOCP,都是採用IO多路復用技術,即事件監聽。

libuv中的執行緒只需要把網路IO的socket註冊到epoll/IOCP中,然後就可以返回,等資料準備好的時候,執行緒再來取,不會阻塞執行緒,所以libuv中線程池預設開四個執行緒也夠用了

2樓:詹森先生

幾個答主回答還是有點小誤導。實現非同步的不是靠底層的執行緒池...不是把同步的邏輯放到執行緒池做。

而是使用epoll做事件迴圈。執行緒池中只有發起io的一瞬間,還有io返回的一瞬間占用執行緒。然後只是輪詢去問是否已經返回了,而不是一直阻塞著執行緒池中的乙個執行緒。

3樓:aaaaaaaaaaaaaaa

執行緒池是用來處理普通檔案 IO 的(fs 模組,dns 模組),而不是裝置檔案 IO 的(net 模組,http 模組,child_process 模組)。

4樓:朱涵俊

一種是搶占式,一種是輪循。搶占式利用時間片根據優先順序排程,是作業系統級別的執行緒。輪循的在作業系統看來只有乙個執行緒,利用非同步呼叫需要同步阻塞的應用,實現切換。

作業系統提供同步跟非同步2種方式呼叫,比如讀檔案,如果是同步,呼叫者立即掛起,這樣就無法排程了。用非同步呼叫,然後去佇列查詢之前非同步呼叫並且已經完成的,或者有io事件進來需要處理的「執行緒」。

搶占式你寫個for(;;)死迴圈不影響其他執行緒。輪循的這樣寫所有的都死了。

5樓:itlr

如果你用PHP的pthread,那就是普通的POSIX thread,沒什麼特別的,請看Threads — An Introduction to libuv

6樓:就想叫yoko

一種是原始的one connection per thread,一種是non-block event loop,註冊io,事件驅動,乙個執行緒就能hold n個連線

執行緒同步 非同步 與 I O同步 非同步 中的同步 非同步描述的是同乙個概念麼?

純果樂 I O應該是阻塞和非阻塞。同步非同步阻塞非阻塞,是兩組不同的概念。非阻塞和同步完全可以並存,比如select,poll,epoll等 快樂領讀 同步IO 指,你乙個請求下去,要等待返回,才能做下一步。執行緒同步是說,2個執行緒一起幹活的時候,是要配合好的,不能各自忙各自的,使用synchro...

Netty的Reactor執行緒組中的每個Reactor執行緒處理網路I O為什麼一定要序列化,並行化不是更能提高系統吞吐量嗎?

羅傑 那個序列指是的當前請求 解碼 業務處理 當解碼完了再提交給執行緒處理有上下文開銷的,如果沒有指定執行緒組當前執行緒繼續執行業務處理 目前是減少上下文切換開銷 未言 通俗來講,每個請求用乙個執行緒來處理,一是可以保證位元組序列傳過來進行解碼,分包,還有讀取等的順序性 二是避免執行緒間資源競爭,執...

java 中的hashmap在多執行緒中是不安全的,開發中還經常用,是spring框架幫忙解決了嗎 ?

程式猿弟弟 不安全 第一時間就會想到多執行緒吧。只有在多執行緒併發的情況下才會出現不安全的。我們在開發的過程中,乙個請求就是乙個執行緒。在乙個執行緒裡面做hashmap儲存是沒有問題的。我覺得樓主提的問題應該是spring在使用單利bean物件是如何保證request執行緒的隔離。這樣問才有意義。 ...