前言
在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.