異步IO(一)

前言

在web2.0的時候,其實前端就很熟悉異步編程了,只不過那時大家使用的是ajax(典型的網絡請求)實現的,還有一些前端的事件機制(針對事件定義回調事件)。

但是在傳統的高級編程中,異步編程很少被使用,因爲大部分程序員不習慣異步編程來進行程序設計。而node是首個將異步作爲主要編程方式和設計理念的編程語言。

與node事件驅動、異步io設計理念相近的是nginx,它具備向客戶端管理連接的巨大能力,但是其底層還是受制於各種同步的編程方式。而node是全方面的,既可以作爲服務端去處理客戶端帶來的大量併發請求,也能作爲客戶端去向網絡中的各個應用進行併發請求。

爲什麼要異步

用戶體驗

最早的瀏覽器中js是單線程的,獲取一個網絡資源需要同步獲取,如果有兩個請求,時間消耗分別爲M,N,那麼同步請求的時間則爲兩者之和;而如果是異步,則是取較大者;另外一個明顯的區別就是同步會阻塞ui渲染,而異步不會。

在大時代背景下,越來越多的微服務是分佈的,而隨着服務的增多這部分開銷會線型增長,也意味着放大同步和異步的性能差異。在下面的表格中,我們列舉了一些從cpu緩存到網絡的數據訪問所需要的開銷作爲對比。

io類型

花費時間週期

cpu一級緩存

3

cpu二級緩存

14

內存

250

硬盤

41000000

網絡

240000000

資源分配

場景:如果有若干不相干的任務需要完成,主要有兩種方式: 1 單線程順序執行 2 多線程併發完成

分析:針對兩種的優缺點進行簡要分析

實現方式

優點

缺點

其他

單線程順序執行

符合編程思維

性能不好,任何一個任務慢會導致其他阻塞,在計算機中,io和cpu計算可以並行進行的,但同步編程中的io會讓其他任務阻塞

多線程併發

更好的利用cpu

面臨鎖、狀態同步的問題

前提是創建線程的開銷遠小於並行任務

爲了彌補單線程無法利用多核cpu的缺點,node提供了類似web worker的子進程,子進程通過工作進程高效的利用cpu和io.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章