
概述
隨著移動互聯(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ù)或者方案,最好能了解一下他的前世今生?。?!