異步編程模型的思考

WX20211101-190630@2x.png

概述

隨著移動互聯(lián)網(wǎng)的迅猛發(fā)展,我們對于服務(wù)的響應(yīng)和并發(fā)要求越來越高。在這樣的背景下催生了形形色色的并發(fā)問題、例如C10問題就是非常典型的問題。對于這些形形色色的并發(fā)問題,人們演化設(shè)計出多種異步編程的模型。所謂的并發(fā)是指在同一時間段內(nèi)程序能交替運(yùn)行。

關(guān)于異步編程思考

在開始之前有這么幾個問題需要探討,什么是異步編程模型、異步編程能解決哪些問題、如何設(shè)計出一個異步編程模型。

什么是異步編程

同步/異步:是指程序自始至終都在用一個時間線上運(yùn)行,異步則是我程序是主時間線上出現(xiàn)了別的時間線分支。

異步編程解決了什么問題

異步編程的宗旨:是高效地解決并發(fā)問題,獲得更高的并發(fā)請求

異步編程具體實(shí)現(xiàn)方案

  • 事件輪詢

將數(shù)據(jù)交互過程中出現(xiàn)的各種事件注冊到一個事件隊(duì)列中,再由一些其他的線程來異步消費(fèi)處理

  • 回調(diào)

在上述的事件隊(duì)列中,其實(shí)有個問題,往事件隊(duì)列中注冊一個事件之后,等該事件被觸發(fā)的那刻,誰來處理后續(xù)的業(yè)務(wù)邏輯?對于這個問題的解決方式就是“回調(diào)”,現(xiàn)在高級編程語言都支持“回調(diào)”功能。有了“回調(diào)”,開發(fā)者可以在事件觸發(fā)前將回調(diào)函數(shù)和事件綁定起來,等事件觸發(fā)那一刻,查找出注冊好的回調(diào)函數(shù)在去執(zhí)行回調(diào)函數(shù)的邏輯。至此通過回調(diào)就輕松實(shí)現(xiàn)了異步編程模型。

  • 協(xié)程

雖說有了回調(diào)就就能滿足異步編程,但是回調(diào)帶來的問題也相當(dāng)多,比如回調(diào)中嵌套回調(diào)(地獄回調(diào))、代碼不符合人類思維、難于開發(fā)維護(hù)等。其實(shí)人類編程思維還是習(xí)慣于同步的編程邏輯,在代碼按照書寫的順序一行一行去執(zhí)行,每次執(zhí)行結(jié)束都能有個返款?。?!那么說到這里有沒有一種可能?就是我既能達(dá)到異步的效果還能書寫同步的代碼,換言之:就是用同步的代碼書寫異步的情懷!?。〈鸢甘强隙ǖ?,協(xié)程真是這樣背景下出現(xiàn)的一個將異步回調(diào)的方式轉(zhuǎn)化為同步代碼、但是又有異步功能的技術(shù)。協(xié)程是一種輕量級線程,調(diào)度的邏輯完全就交給用戶去控制。這樣用戶就可以在遇到同步IO的時候 ,掛起當(dāng)前協(xié)程轉(zhuǎn)而執(zhí)行下一個協(xié)程,整個代碼邏輯都是順序書寫,被掛起的協(xié)程,等待下次再次調(diào)度執(zhí)行。

盤點(diǎn)主流語言和服務(wù)器軟件異步模型

在這邊一起梳理一下市面上主流語言和軟件的一些異步編程模型

nginx 是多進(jìn)程+單進(jìn)程reactor異步模型,網(wǎng)絡(luò)請求事件都有reactor線程接管注冊分發(fā)給worker進(jìn)程去執(zhí)行

redis 單線程 reactor異步模型 也是事件分發(fā)注冊異步編程

netty 單線程reactor異步模型

swoole 多線程reactor+多進(jìn)程worker

nodejs 單線程+eventLoop

Golang 單線程Reactor+多線程協(xié)程

總結(jié)

任何技術(shù)方案都是在歷史長河中演化而來,因此了解一門技術(shù)或者方案,最好能了解一下他的前世今生?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容