非同步io有什麼優勢?

時間 2021-05-11 22:16:57

1樓:

非同步io相對同步io可以提高吞吐量。因為非同步把真正的io操作交給作業系統/其他執行緒執行,主線程可以直接往後跑了;同步的話無論如何也要等io完成才能繼續執行。

另外,很多人拿同步io關注事件開始、非同步io關注事件完成作為同步非同步io的區別,我認為這點不是它們的本質區別,拿這個來舉例子多半是受了國內網路上各種以訛傳訛的部落格的影響,並沒有理解到關鍵點。

2樓:朱涵俊

不要去算乙個呼叫的效能比,要看整個系統。拿web伺服器來說,如果同步呼叫,那麼執行緒經常阻塞,為了提高吞吐量,必須開大量執行緒,幾萬幾十萬,這個系統開銷是非常大的,執行緒切換的開銷也很大,假如每秒服務10萬請求,每個請求都是乙個執行緒,那麼至少切換10萬/核次執行緒。這個開銷是很大的。

這也是nginx可以同時處理幾萬幾十萬,而Apache大都幾千就了不起了。

現在為了高效能都避免使用執行緒,一般乙個虛擬cpu乙個執行緒,盡量避免執行緒切換,這個在後端一般都這樣設計。

我以前對比過nginx加php-fpm跟nginx內嵌lua的效能對比,不在乙個數量級,不是說php效能比lua差很多,而是體系決定的。lua內嵌入nginx,可以使用nginx這套非同步模式。而php-fpm做不到,如果哪天php也能內嵌入nginx,效能也會大幅提高。

3樓:胡宇光

好處在於,你可以很方便的將多個非同步操作歸併為乙個。如果是nonblock則不太容易做到。考慮你要實現乙個非同步版本的readn,你能很容易組合多個非同步的read,只要在完成函式裡發出下乙個read就行。

如果read是nonblock的話,你想想該如何實現乙個nonblock的readn。

另乙個好處是,nonblock必須有乙個buffer在快取資料。而非同步則要靈活一些。

雖然linux下常用的系統api都是nonblock的,但是程式模組之間很少見到用這種模式的,比如你要提供乙個querydb的介面給其他模組用,query可能比較耗時,你想想看這個api如果實現成非同步就只要加乙個callback引數就行,而如果要搞成nonblock的怎麼搞。

4樓:itlr

吞吐量。比如銀行櫃檯前乙個使用者在填表的時候會讓後乙個使用者上來遞材料,而不是讓櫃員幹等。這並不改變兩個使用者業務處理的絕對時間,其實也不節省什麼資源(non-blocking io說的能節省資源,是乙個side effect,因為程序不幹等就不用維護棧,省點記憶體),但櫃員的工作吞吐量增加了。

單個節點吞吐量高了,服務需要的節點數就可以減少,省錢。

5樓:魯哈花

1、非同步io大致形成乙個通知鏈。否則就是輪詢。通知鏈比輪詢效率要高。

2、同步io、非同步io,使用者態和核心都要做工作。非同步io使用者態的工作比較少,更有優勢。

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

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

redis為什麼不使用非同步io而使用多路io復用?

老虎說 非同步io在Linux系統目前為止還不成熟,多路復用是同步io和非同步io之間的一種折衷方案。並且多路復用模型已經能很大程度上解決併發程式設計問題了 iovec 非同步IO的要求是,從核心複製資料到使用者態這個過程是非阻塞的。使用者提前設定好的資料接收緩衝區,當IO就緒,作業系統會自己執行I...

什麼程式語言機制是處理非同步 IO 最恰當的抽象?

何志斌 目前看,最好的方式還是async和await。2017年7月1日修改 也許使用者態多執行緒 協程 這種方式更好。我需要一些時間去實驗一下Go Kotlin king wt 真夠 乎的,你寫的接觸的,天天看的 互動事件都是事件非同步驅動的,你天天用的 伺服器是事件非同步驅動的。如果程式不建立監...